我们可以使用 apply 在基于逻辑向量的子集后循环遍历行 (MARGIN = 1)、paste 元素 (names) (toString => paste(..., collapse=", "))
df1$new <- apply(df1, 1, FUN = function(x) toString(names(x)[x]))
df1
# x y z w new
#1 TRUE FALSE TRUE FALSE x, z
#2 TRUE TRUE TRUE FALSE x, y, z
#3 FALSE FALSE TRUE TRUE z, w
或者使用tidyverse,我们可以重新整形为'long'格式(pivot_longer)并通过(row_number()),paste进行分组
library(dplyr)
library(tidyr)
df1 %>%
mutate(rn = row_number()) %>%
pivot_longer(cols = -rn) %>%
group_by(rn) %>%
summarise(new = toString(name[value])) %>%
select(-rn) %>%
bind_cols(df1, .)
或者另一个选项是c_across
df1 %>%
rowwise %>%
mutate(new = toString(names(.)[c_across(everything())]))
# A tibble: 3 x 5
# Rowwise:
# x y z w new
# <lgl> <lgl> <lgl> <lgl> <chr>
#1 TRUE FALSE TRUE FALSE x, z
#2 TRUE TRUE TRUE FALSE x, y, z
#3 FALSE FALSE TRUE TRUE z, w
数据
df1 <- structure(list(x = c(TRUE, TRUE, FALSE), y = c(FALSE, TRUE, FALSE
), z = c(TRUE, TRUE, TRUE), w = c(FALSE, FALSE, TRUE)),
class = "data.frame", row.names = c("1",
"2", "3"))