满足条件的特定列的行总和

问题描述 投票:0回答:3

我正在尝试对满足某些条件的数据的特定列进行求和, 就像下面的例子

library(dplyr)
library(readr)
set.seed(123)
data=data.frame(id=1:4,
                v1=sample(c("a","b"),4,TRUE),
                v2=sample(c("a","b"),4,TRUE),
                v3=sample(c("a","b"),4,TRUE),
                v4=sample(c("a","b"),4,TRUE),
                v5=sample(c("a","b"),4,TRUE),
                v5=sample(c("a","b"),4,TRUE)
                )
data%>%
  rowwise()%>%
  mutate(across(v1:v4,~sum(.x=="a")))%>%
  mutate(n_a=sum(c(v1,v2,v3,v4)))
#> # A tibble: 4 × 8
#> # Rowwise: 
#>      id    v1    v2    v3    v4 v5    v5.1    n_a
#>   <int> <int> <int> <int> <int> <chr> <chr> <int>
#> 1     1     1     1     1     0 b     a         3
#> 2     2     1     0     1     1 a     b         3
#> 3     3     1     0     0     0 a     a         1
#> 4     4     0     0     0     1 a     a         1

这里 n_a 是从 v1 到 v4 的值为 a 的变量之和 可以更好地实现我的代码吗?

  • 一个突变系,没有其他变量的转化?
  • 我可以将 sum 与 v1:v4 之类的东西一起使用吗?

创建于 2023-07-28,使用 reprex v2.0.2

r dplyr mutate rowsum
3个回答
2
投票

您可以将

rowSums
pick
-

一起使用
library(dplyr)

data %>%
  mutate(n_a = rowSums(pick(v1:v4) == "a", na.rm = TRUE))

#  id v1 v2 v3 v4 v5 v5.1 n_a
#1  1  a  a  a  b  b    a   3
#2  2  a  b  a  a  a    b   3
#3  3  a  b  b  b  a    a   1
#4  4  b  b  b  a  a    a   1

1
投票

几天前有人问过类似的问题这里

您可以将

rowSums
==
一起使用。

data$n_a <- rowSums(data[, 2:6] == "a")

data
  id v1 v2 v3 v4 v5 n_a
1  1  a  a  a  b  b   3
2  2  a  b  a  a  a   4
3  3  a  b  b  b  a   2
4  4  b  b  b  a  a   2

计数的列也可以根据需要自定义。

data$n_a <- rowSums(data[, -1] == "a")
data$n_a <- rowSums(data[, c("v1", "v2", "v3", "v4", "v5")] == "a")
data$n_a <- rowSums(data[, startsWith(colnames(data), "v")] == "a")

0
投票

您的代码是正确的方法,但是要缩短代码,您可以选择相反的方式,在第二行的

across()
内使用
sum()
,并在
across()
内定义一个函数来计算
"a"
字符:

library(tidyverse) 
data %>% rowwise() %>% mutate(n_a=sum(across(v1:v4, \(x) x=="a")))

     id v1    v2    v3    v4    v5    v5.1    n_a
  <int> <chr> <chr> <chr> <chr> <chr> <chr> <int>
1     1 a     a     a     b     b     a         3
2     2 a     b     a     a     a     b         3
3     3 a     b     b     b     a     a         1
4     4 b     b     b     a     a     a         1
© www.soinside.com 2019 - 2024. All rights reserved.