我需要做一个简单的转换。(最好是德普利尔(我想创建一个新变量 (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 年的最大变量。
which.max(.[5,])
将返回您通过管道传输的 data.frame 的第 5 行最大值的索引。然后,我们使用此值将varD
的两个可能值计算为变量a
和b
。
计算这些变量实际上非常简单。一旦我们知道我们正在处理的变量的索引,我们就可以使用括号表示法来子集原始数据框(使用.
访问(。请注意,我们需要在这里使用unlist
,因为子集将生成一个 1 变量 data.frame,而mutate
需要一个向量。
然后,我们可以在创建varD
时使用基于row_number
的if_else
表达式在这两个变量之间进行选择。最后,我们删除a
并b
,因为它们不再需要。
x %>%
mutate(a = unlist(.[,which.max(.[5,])]),
b = unlist(.[5, which.max(.[5,])] - .[5, 'varA']) + varA,
varD = if_else(row_number() <= 5, a, b)) %>%
select(-c(a,b))
# A tibble: 10 x 5
year varA varB varC varD
<int> <dbl> <dbl> <dbl> <dbl>
1 1 1 1 -10 -10
2 2 3 11 -20 -20
3 3 5 21 -30 -30
4 4 7 31 104 104
5 5 9 41 105 105
6 6 11 51 106 107
7 7 13 61 107 109
8 8 15 71 108 111
9 9 17 81 109 113
10 10 19 91 110 115
使用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)