引用 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)
我有很多专栏,例如 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)