假设我有以下数据:

df<- data.frame(
  id = c(1,1,1,1,2,2,2,3,3,4,4,4,5,5,5,5,5,6),
  age =c (41,43,20,8,33,30,6,45,90,60,7,3,50,50,7,1,83,45),
  activity = c(412,442,0,0,419,413,0,421,0,412,0,0,421,411,0,0,0,425),
  minute = c(10,15,0,0,20,15,0,25,0,20,0,0,25,20,0,0,0,30)
)

我想要的是确定专栏消费者的价值,那些从制作人生产的活动中受益的人.列id对于所有家庭成员都是相同的.activity栏显示一个会员做了什么活动;412、442、413、419和411是只为15岁以下 children 做的活动,421和425是成人做的活动,15岁以上的人;'activity栏价值非零的人是生产者,其他人是潜在消费者.第minute栏显示花在一项活动上的时间.当我确定消费者时,我必须将"分钟"列的值分配给消费者.如果一个家庭中有不止一个消费者,我必须为所有消费者分配相同的时间. 我的预期yields 是这样的:

    id age activity minute consumers
1   1  41      412     10         0
2   1  43      442     15         0
3   1  20        0      0        25
4   1   8        0      0        25
5   2  33      419     20         0
6   2  30      413     15         0
7   2   6        0      0        35
8   3  45      421     25         0
9   3  90        0      0        25
10  4  60      412     20         0
11  4   7        0      0        20
12  4   3        0      0        20
13  5  50      421     25         0
14  5  50      411     20         0
15  5   7        0      0        20
16  5   1        0      0        20
17  5  83        0      0        25
18  6  45      425     30        30

我try 了以下代码,但似乎不是基于我的预期输出:

df <- df %>%
  group_by(id) %>%
  mutate(
    consumers = ifelse(activity == 0 & age > 15, sum(minute), 0)
  )

提前谢谢你.

推荐答案

我认为我们要根据该行的age值和activity个生产者来总结不同的活动.

  • 如果activity不是零,则consumers应该是0
  • 如果是age < 15,那么我们需要为您的"仅限 children "列表中的那些活动总结分钟数
  • 同样,如果age >= 15分钟,我们需要总结其他活动的分钟数

这意味着在您的预期输出中,第3行(年龄为20岁)应该分配0个值,因为id=1中的两个activity值都是"仅供 children 使用".

我想现在是用case_when的好时机.

library(dplyr)
df |>
  group_by(id) |>
  mutate(
    consumers = case_when(
      activity > 0 ~ 0, 
      age < 15 ~ sum(minute[activity %in% c(411, 412, 413, 419, 442)]),
      age >= 15 ~ sum(minute[activity %in% c(421, 425)])
    )
  ) |>
  ungroup()
# # A tibble: 18 × 5
#       id   age activity minute consumers
#    <dbl> <dbl>    <dbl>  <dbl>     <dbl>
#  1     1    41      412     10         0
#  2     1    43      442     15         0
#  3     1    20        0      0         0
#  4     1     8        0      0        25
#  5     2    33      419     20         0
#  6     2    30      413     15         0
#  7     2     6        0      0        35
#  8     3    45      421     25         0
#  9     3    90        0      0        25
# 10     4    60      412     20         0
# 11     4     7        0      0        20
# 12     4     3        0      0        20
# 13     5    50      421     25         0
# 14     5    50      411     20         0
# 15     5     7        0      0        20
# 16     5     1        0      0        20
# 17     5    83        0      0        25
# 18     6    45      425     30         0

sum(c(0, minute[..]))中的0是为了防止minute[..]没有匹配(所以没有数字可加).如果你愿意

R相关问答推荐

根据固定值范围在tible中添加新行

提取R中值和列名的所有可能组合

从API中抓取R数据SON

行式dppr中的变量列名

判断字符串中数字的连续性

在组中添加值增加和减少的行

如何优化向量的以下条件赋值?

如何编辑gMarginal背景以匹配绘图背景?

我如何才能找到FAMILY=POISSON(LINK=&Q;LOG&Q;)中的模型预测指定值的日期?

将文件保存到新文件夹时,切换r设置以不必创建目录

R-按最接近午夜的时间进行筛选

以NA为通配符的R中的FULL_JOIN以匹配其他数据中的任何值.Frame

具有重复元素的维恩图

在R中使用列表(作为tibble列)进行向量化?

观察器中的inaliateLater的位置

如果条件匹配,则使用Mariate粘贴列名

按两个因素将观测值分组后计算单独的百分比

访问数据帧中未定义的列时出现R错误

我已经运行了几个月的代码的`Palette()`中出现了新的gglot错误

分隔日期格式为2020年7月1日