使用mutate以动态命名列为条件创建新类别

时间:2019-07-20 08:57:37

标签: r

我正在尝试根据另一组列的值创建一个新列category。但是,我想动态选择要作为条件的列,而不是对列名进行硬编码。如果可能的话,我想留在tidyverse中。

这是我的可重复性最低的示例:

library(dplyr)

df <- tibble(user = c("A", "B", "C", "D", "E"),
       jan = c(200, 500, 0, 20, 0),
       feb = c(50, 10, 0, 0, 50),
       mar = c(10, 100, 20, 0, 0),
       apr = c(500, 10, 0, 20, 0))

如果该行在最近3个月中的每个月中都有非零值,则category列应包含值'stable'。这段代码可以满足我的要求:

df %>%
  mutate(category = if_else(feb != 0 & mar != 0 & apr != 0, "stable", NA_character_))

但是,如果我想每月运行一次此代码(添加一个新月的数据之后),我将不断对其进行更新以引用最近3个月的列名。

有没有一种方法可以动态地做到这一点?我尝试将列位置与last_col(offset = 2:0)一起使用,但没有成功。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

我认为使用R底基会很简单,可以做到

n <- 3
df$category <- c(NA, "stable")[(rowSums(df[tail(names(df), n)] != 0) == n) + 1]

#  user    jan   feb   mar   apr category
#  <chr> <dbl> <dbl> <dbl> <dbl> <chr>   
#1 A       200    50    10   500 stable  
#2 B       500    10   100    10 stable  
#3 C         0     0    20     0 NA      
#4 D        20     0     0    20 NA      
#5 E         0    50     0     0 NA      

答案 1 :(得分:2)

罗纳克·沙(Ronak Shah)的答案已经捕捉到了基本逻辑,但这可能是dplyr可能的方式之一:

n <- 3

df %>%
  mutate(
    category = ifelse(
      rowSums(select(., last_col(offset = 0:(n-1))) == 0) > 0, 
      NA_character_, 
      "stable")
  )