我想要:
- 使用
across 和
case_when
检查列A1-A3是否等于1 - 连接A1-A3等于1的列名,并
- 创建一个新列,其中包含连接后的列名
我的数据框:
df <- tribble(
~ID, ~A1, ~A2, ~A3,
1, 0, 1, 1,
2, 0, 1, 1,
3, 1, 1, 1,
4, 1, 0, 1,
5, 0, 1, 0)
期望输出:
# A tibble: 5 x 5
ID A1 A2 A3 New_Col
<dbl> <dbl> <dbl> <dbl> <chr>
1 1 0 1 1 A2 A3
2 2 0 1 1 A2 A3
3 3 1 1 1 A1 A2 A3
4 4 1 0 1 A1 A3
5 5 0 1 0 A2
到目前为止,我已经尝试过:
df %>%
rowwise() %>%
mutate(New_Col = across(A1:A3, ~ case_when(. == 1 ~ paste0("colnames(.)", collapse = " "))))
输出不正常:
ID A1 A2 A3 New_Col$A1 $A2 $A3
<dbl> <dbl> <dbl> <dbl> <chr> <chr> <chr>
1 1 0 1 1 NA colnames(.) colnames(.)
2 2 0 1 1 NA colnames(.) colnames(.)
3 3 1 1 1 colnames(.) colnames(.) colnames(.)
4 4 1 0 1 colnames(.) NA colnames(.)
5 5 0 1 0 NA colnames(.) NA
我想学的内容:
- 是否可以使用
across
来检查多个列的条件?
- 如果可以,那么在
case_when
的 ~ 后面是什么样的代码来获取特定的列名?
- 如何在使用
mutate
、across
和 case_when
后只获取一列,而不是像这里一样获取3列。
我曾经以为自己已经掌握了这个任务,但不知怎么回事现在却忘记了...
rowwise
或group_by
ID
中对吧?我认为我们做不到,因为cur_column
只能在across
中使用。 - Ronak Shah