我正在尝试根据另一组列的值创建一个新列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)
一起使用,但没有成功。任何帮助将不胜感激。
答案 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")
)