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

yeotifhr  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(192)

我是R的新手,正在为下面的问题而挣扎。我有一个数据集,其中包含人口统计学特征和几个变量,这些变量基于我们编码的定性数据。有六个基于音调的变量,分别称为音调1、音调2、音调3、音调4、音调5和音调6。音调变量是分类的(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[,“Tone 6”]的列,其中填充了NA。

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

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

tjvv9vkg

tjvv9vkg1#

您可以避免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
wd2eg0qa

wd2eg0qa2#

这里有一个整洁的方式:

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

reprex package(v2.0.1)于2023年1月19日创建

相关问题