【问题标题】:Row-wise sum of logical values in a dataframe数据帧中逻辑值的逐行总和
【发布时间】:2021-09-09 08:53:40
【问题描述】:

我有一个这样的数据框(有更多变量)

tb = data.frame(ID=c("a","b","c"),V1=c(TRUE,FALSE,TRUE),
                V2=c(FALSE,FALSE,TRUE),V3=c(TRUE,TRUE,FALSE) )
tb 

  ID    V1    V2    V3
1  a  TRUE FALSE  TRUE
2  b FALSE FALSE  TRUE
3  c  TRUE  TRUE FALSE

我需要按行添加第四个变量,其中包含真值之和 像这样,但保留所有其他变量

tb %>%
 select(V1:V3) %>%
 mutate(out = rowSums(.))

     V1    V2    V3 out
1  TRUE FALSE  TRUE   2
2 FALSE FALSE  TRUE   1
3  TRUE  TRUE FALSE   2

【问题讨论】:

  • 试试tb %>% mutate(res = rowSums(.[-1]))

标签: r dplyr


【解决方案1】:

dplyr 解决方案

在单个调用中,您可以使用 where 内部的选择帮助程序 across 仅将满足条件 (is.logical) 的列提供给 rowSums

tb %>% mutate(sum = rowSums(across(where(is.logical))))

  ID    V1    V2    V3 sum
1  a  TRUE FALSE  TRUE   2
2  b FALSE FALSE  TRUE   1
3  c  TRUE  TRUE FALSE   2

您还可以按内部名称选择列,或使用starts_withmatches 的名称模式:

tb %>% mutate(sum = rowSums(across(V1:V3)))
#OR
tb %>% mutate(sum = rowSums(across(starts_with("V"))))
#OR
tb %>% mutate(sum = rowSums(across(matches("V\\d"))))

【讨论】:

    【解决方案2】:

    也许不是dplyr 方式,但您可以mutate() 中使用select(),如下所示:

    tb %>% mutate(out = rowSums(tb %>% select(V1:V3)))
    
    
      ID    V1    V2    V3 out
    1  a  TRUE FALSE  TRUE   2
    2  b FALSE FALSE  TRUE   1
    3  c  TRUE  TRUE FALSE   2
    

    【讨论】:

    • 它是否将TRUE 视为1?很好,我不知道。
    • @sindri_baldur,我喜欢管道解决方案中的管道!我没有意识到这种可能性!绝招
    猜你喜欢
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    相关资源
    最近更新 更多