引用 mutate 中具有相似模式的列

Reference to columns with similar pattern in mutate

我有很多专栏,例如 pr_1、pr_2、pr_3、....我想在 mutate 和 [=12] 中引用它们=] 使用他们相似的模式(或他们的索引),而不是像下面那样写所有的列名。

df<- data.frame(p=c(1,2,3), pr_1=c(1,4,5), pr_2=c(0,1,6), pr_3=c(0,1,4))

df <- df %>% 
 mutate(green=(ifelse(p < pr_1 | p < pr_2 | p < pr_3, 0 , 1)))

1) cur_data 在 dplyr 1.0 中,我们可以使用 cur_data() 引用 rowwise 中的当前行。 (如果唯一的列是 p 并且 pr 列和 p 排在第一位,我们可以将 select 替换为 cur_data()[-1]。)

df %>%
  rowwise %>%
  mutate(green = +!any(p < select(cur_data(), starts_with("pr")))) %>%
  ungroup

给予:

# A tibble: 3 x 5
      p  pr_1  pr_2  pr_3 green
  <dbl> <dbl> <dbl> <dbl> <int>
1     1     1     0     0     1
2     2     4     1     1     0
3     3     5     6     4     0

1a) 或者如果 p 的值是唯一的并且除了 p 和 pr 列之外没有其他列:

df %>%
  group_by(p) %>%
  mutate(green = +!any(p < cur_data())) %>%
  ungroup

2) apply 另一种方法是使用apply:

df %>%
  mutate(green = +!apply(p < select(., starts_with("pr")), 1, any))

给予:

  p pr_1 pr_2 pr_3 green
1 1    1    0    0     1
2 2    4    1    1     0
3 3    5    6    4     0

3) c_across 我们也可以使用 dplyr 1.0 c_across 。我们已经展示了如何使用 if_else 但我们可以像上面那样使用 +!any(...)

df %>%
  rowwise %>%
  mutate(green = if_else(any(p < c_across(starts_with("pr"))), 0, 1)) %>%
  ungroup

给予:

# A tibble: 3 x 5
      p  pr_1  pr_2  pr_3 green
  <dbl> <dbl> <dbl> <dbl> <dbl>
1     1     1     0     0     1
2     2     4     1     1     0
3     3     5     6     4     0

在 base R 中,您可以 select 具有 grep 的列,将它们与 p 列进行比较并使用 rowSums

cols <- grep('pr', names(df))
df$green <- +(rowSums(df$p < df[cols]) == 0)