我有以下数据框:
dF
x y z w
<lgl> <lgl> <lgl> <lgl>
1 TRUE FALSE TRUE FALSE
2 TRUE FALSE TRUE FALSE
3 TRUE FALSE TRUE FALSE
我想创建一个新列,该列为每一行存储等于TRUE的列,因此例如第1行将为c(x,z)(例如,字符格式)。
在R中想得到以下输出
x y z w new
TRUE FALSE TRUE FALSE x,z
TRUE TRUE TRUE FALSE X,Y,Z
FALSE FALSE TRUE TRUE Z,W
我已经尝试过从堆栈溢出的代码之一,但是我得到列表形式的结果,即:c(x,z)但我想要x,z请对此进行指导。谢谢。
我们可以使用适用于遍历行(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
,我们可以将其整形为“长”格式(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"))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句