dplyr-根据变量值对数据进行变异

时间:2018-10-08 19:02:34

标签: r dplyr

我需要做一个简单的转换。 (最好是在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年最大变量的解决方案。

2 个答案:

答案 0 :(得分:2)

which.max(.[5,])将返回通过管道插入的data.frame的第5行最大值的索引。然后,我们使用此值计算varD的两个可能值作为变量{{1 }}和a

计算这些变量实际上非常简单。一旦知道了要使用的变量的索引,就可以使用方括号表示法对原始数据帧(用b访问)进行子集化。请注意,我们这里需要使用.,因为子集将生成一个1变量的data.frame,而unlist需要一个向量。

然后,当我们创建mutate时,可以使用基于if_else的{​​{1}}表达式在这两个变量之间进行选择。最后,由于不再需要row_numbervarD,我们将其删除。

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)