我是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)创建