r语言 - 如何基于其他变量创建计数变量



我是R的新手,正在努力解决以下问题。我有一个数据集,其中包含人口统计特征和几个基于我们编码的定性数据的变量。基于音调有六个变量,分别是Tone1、Tone2、Tone3、Tone4、Tone5和Tone6。语气变量是分类的(1 =正;2 =负;3 =中性)。每个应答者可以有一个以上的语气。我试图创建两个变量-一个是在每个观察的6个音调列中计数1(正),另一个是在6列中计数2(负)。我在网上找不到我要找的东西。

The df looks somewhat like this:
resp.   Tone1. Tone2. Tone3. Tone4. Tone5. Tone6. 
a.        1.     2.    1.      1.     2.     NA
b.        2.     2.    NA.     NA.    NA.    NA. 
c.        3.     1.    NA.     NA.    NA.    NA 
d.        1.     1.    2.      2.     1.     1.  
# Creating example df
df <- data.frame( resp = c("a", "b",
"c", "d"),
Tone1 = c(1, 2, 3, 1),
Tone2 = c(2, 2, 1, 1),
Tone3 = c(1, NA, NA, 2),
Tone4 = c(1, NA, NA, 2), 
Tone5 = c(2, NA, NA, 1),
Tone6 = c(NA, NA, NA, 1)) 
and I am looking to get this:
resp.   Tone1. Tone2. Tone3. Tone4. Tone5. Tone6. count_pos. count_neg. 
a.        1.     2.    1.      1.     2.     NA.   3.          2
b.        2.     2.    NA.     NA.    NA.    NA.   0           2
c.        3.     1.    NA.     NA.    NA.    NA    1           0
d.        1.     1.    2.      2.     1.     1.    4           2 

我已经尝试了以下内容,它没有给我想要的结果,我最终得到了一个名为count_pos[,"Tone6"]的列,其中填充了NA。

gesis$count_pos <- 0
for (i in 1:6) {
gesis$count_pos <- gesis$count_pos + ifelse(gesis[,paste0("Tone",i)]==1,1,0)
}

我真的很感激任何建议和提前感谢!我真的希望这不会太复杂。

可以避免使用for循环而使用rowSums

df$count_pos <- rowSums(df[, 2:7]==1, na.rm=TRUE)
df$count_neg <- rowSums(df[, 2:7]==2, na.rm=TRUE)
df
resp Tone1 Tone2 Tone3 Tone4 Tone5 Tone6 count_pos count_neg
1    a     1     2     1     1     2    NA         3         2
2    b     2     2    NA    NA    NA    NA         0         2
3    c     3     1    NA    NA    NA    NA         1         0
4    d     1     1     2     2     1     1         4         2

这里有一个整洁的方法:

library(dplyr)
df <- data.frame( resp = c("a", "b",
"c", "d"),
Tone1 = c(1, 2, 3, 1),
Tone2 = c(2, 2, 1, 1),
Tone3 = c(1, NA, NA, 2),
Tone4 = c(1, NA, NA, 2), 
Tone5 = c(2, NA, NA, 1),
Tone6 = c(NA, NA, NA, 1)) 
df %>% 
rowwise() %>% 
mutate(tone_pos = sum(c_across(contains("Tone")) == 1, na.rm=TRUE), 
tone_neg = sum(c_across(contains("Tone")) == 2, na.rm=TRUE))
#> # A tibble: 4 × 9
#> # Rowwise: 
#>   resp  Tone1 Tone2 Tone3 Tone4 Tone5 Tone6 tone_pos tone_neg
#>   <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>    <int>    <int>
#> 1 a         1     2     1     1     2    NA        3        2
#> 2 b         2     2    NA    NA    NA    NA        0        2
#> 3 c         3     1    NA    NA    NA    NA        1        0
#> 4 d         1     1     2     2     1     1        4        2

在2023-01-19由reprex包(v2.0.1)创建