我正在尝试对满足某些条件的数据的特定列进行求和, 就像下面的例子
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 的变量之和 可以更好地实现我的代码吗?
创建于 2023-07-28,使用 reprex v2.0.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
几天前有人问过类似的问题这里。
您可以将
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")
您的代码是正确的方法,但是要缩短代码,您可以选择相反的方式,在第二行的
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