在R中,指示每行中的哪些列具有值“true”

时间:2018-03-28 14:42:30

标签: r dplyr aggregate mutate

我有以下数据框:

> 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解决方案!

3 个答案:

答案 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'中的元素分组。通过创建“新”列

在“db”中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获取索引并使用tapplypaste元素

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