r语言 - 基于变量值改变数据



我需要做一个简单的转换。(最好是德普利尔(我想创建一个新变量 (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的两个可能值计算为变量ab

计算这些变量实际上非常简单。一旦我们知道我们正在处理的变量的索引,我们就可以使用括号表示法来子集原始数据框(使用.访问(。请注意,我们需要在这里使用unlist,因为子集将生成一个 1 变量 data.frame,而mutate需要一个向量。

然后,我们可以在创建varD时使用基于row_numberif_else表达式在这两个变量之间进行选择。最后,我们删除ab,因为它们不再需要。

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)

最新更新