我需要做一个简单的转换。 (最好是在dplyr中)我想创建一个新变量(varD),该变量等于第5年中三个变量中的最大值,在此之前的几年中,他必须将变量赋值为等于该变量的变量值。在第5年达到最高,而在第5年之后,他使用变量A的名义变化。
x <- tibble(year = 1:10,
varA = seq(1, 20, 2),
varB = seq(1, 100, 10),
varC = c(-10, -20, -30, 104:110))
应该成为
y <- tibble(year = 1:10,
varA = seq(1, 20, 2),
varB = seq(1, 100, 10),
varC = 101:110,
varD = c(-10, -20, -30, 104, 105, 107, 109, 111, 113, 115))
我觉得使用dplyr时这种操作很麻烦,但是我可能错了...
编辑:之所以喜欢在dplyr中执行此操作,是因为我实际上有另一个定义组的组变量,因此之前使用过group_by。但是其他允许分组的解决方案对我来说也很好。
Edit2:我正在寻找一种无需任何方式指定第5年最大变量的解决方案。
答案 0 :(得分:2)
which.max(.[5,])
将返回通过管道插入的data.frame的第5行最大值的索引。然后,我们使用此值计算varD
的两个可能值作为变量{{1 }}和a
。
计算这些变量实际上非常简单。一旦知道了要使用的变量的索引,就可以使用方括号表示法对原始数据帧(用b
访问)进行子集化。请注意,我们这里需要使用.
,因为子集将生成一个1变量的data.frame,而unlist
需要一个向量。
然后,当我们创建mutate
时,可以使用基于if_else
的{{1}}表达式在这两个变量之间进行选择。最后,由于不再需要row_number
和varD
,我们将其删除。
a
答案 1 :(得分:0)
使用dplyr
:
x %>%
rowwise() %>%
mutate(max = max(varA:varC)) %>%
ungroup() %>%
mutate(max_col = colnames(.)[max.col(.,ties.method="first")],
group = ifelse(year <= 5, 1, 0),
diff = abs(varA - nth(varA, 5)),
varD = ifelse(group == 1, eval(as.symbol(nth(max_col, 5))), nth(max, 5) + diff)) %>%
select(-max, -diff, -group, -max_col)