我有以下数据框:
> db
# A tibble: 3 x 4
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)(例如以字符格式)。
非常感谢dplyr解决方案!
答案 0 :(得分:3)
使用apply
df <-
data.frame(
x = c(T, T, T),
y = c(F, F, F),
z = c(T, F, F),
w = c(T, F, T)
)
df$true_cols <- apply(df, 1, function(data)
names(which(data == T)))
您查看每一行,找到其值设置为&#34; TRUE&#34;的列。这是使用which
函数收集的,它返回一个类似于索引的数字。使用name
功能,可以返回列名而不是列位置。
希望这有帮助。
答案 1 :(得分:1)
在创建行ID之后,我们可以gather
成'long'格式,然后通过'val'列进行子集化后,按'rn',paste
将'key'中的元素分组。通过创建“新”列
mutate
library(tidyverse)
rownames_to_column(db, 'rn') %>%
gather(key, val, -rn) %>%
group_by(rn) %>%
summarise(new = toString(key[val])) %>%
pull(new) %>%
mutate(db, new = .)
# x y z w new
#1 TRUE FALSE TRUE FALSE x, z
#2 TRUE FALSE TRUE FALSE x, z
#3 TRUE FALSE TRUE FALSE x, z
或base R
选项是使用which
获取索引并使用tapply
来paste
元素
i1 <- which(as.matrix(db), arr.ind = TRUE)
tapply(names(db)[i1[,2]], i1[,1], paste, collapse=",")
答案 2 :(得分:1)
使用基数R,您可以执行以下操作。
db$new <- t(apply(db, 1, function(i) names(db)[i]))
# x y z w new.1 new.2
#1 TRUE FALSE TRUE FALSE x z
#2 TRUE FALSE TRUE FALSE x z
#3 TRUE FALSE TRUE FALSE x z
请注意,new
是类matrix
的对象。
str(db)
'data.frame': 3 obs. of 5 variables:
$ x : logi TRUE TRUE TRUE
$ y : logi FALSE FALSE FALSE
$ z : logi TRUE TRUE TRUE
$ w : logi FALSE FALSE FALSE
$ new: chr [1:3, 1:2] "x" "x" "x" "z" ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr "1" "2" "3"
.. ..$ : NULL