我刚刚开始学习R,所以如果这比我想象的要简单,我很抱歉,但我真的很难找到答案。
我正在尝试做的是创建一个带有完整案例计数的向量,按ID,用于多个变量。
例如,在此数据框中:
ID<-c(1:5)
score.1<-c(1, 7, 3, 5, NA, 4, 6, 9, 11, NA)
score.2<-c(2, NA, 7, 6, NA, 5, NA, 7, 10, 1)
sample<-data.frame(ID, score.1, score.2)
ID score.1 score.2
1 1 2
2 7 NA
3 3 7
4 5 6
5 NA NA
1 4 5
2 6 NA
3 9 7
4 11 10
5 NA 1
我正在寻找的输出类似于:
ID Complete
1 4
2 2
3 4
4 4
5 1
有没有办法做到这一点,我错过了?我已经尝试用plyr和sum(complete.cases())来计算(complete.cases(sample)),但是它没有给我实际想要的东西。
对此有任何帮助表示赞赏。
答案 0 :(得分:1)
您可以使用dplyr:
library(dplyr)
sample %>%
mutate(new_var = rowSums(!is.na(sample[,2:3]))) %>%
group_by(ID) %>%
summarize(Complete = sum(new_var))
输出正是您所需要的:
ID Complete
(int) (dbl)
1 4
2 2
3 4
4 4
5 1
答案 1 :(得分:1)
这应该这样做:
score.1_complete <- sample[complete.cases(sample$score.1), ]
score.2_complete <- sample[complete.cases(sample$score.2), ]
total <- rbind(score.1_complete, score.2_complete)
output <- count(total, "ID")
我的推理:
score.1_complete
选择得分1(虽然不一定得分为2)完成的行。 score.2_complete
选择score.2(尽管不一定得分为1)完成的行。因此,计算一个ID在total
中出现的次数,可以得出该ID的完成次数是多少次+1该ID的完成次数为2,这就是您想要的。
答案 2 :(得分:1)
使用包dplyr和基本功能complete.cases,试试
require(dplyr)
sample %>%
mutate(complete = complete.cases(sample)) %>%
group_by(ID) %>%
summarise(complete = sum(complete))
答案 3 :(得分:1)
以下是gather/summarise
的另一个选项。我们使用gather
(来自tidyr
)将“广泛”格式转换为“长”格式,将“非NA”值sum
转换为“ID”。
library(tidyr)
library(dplyr)
gather(sample, score, value,-ID) %>%
group_by(ID) %>%\
summarise(value= sum(!is.na(value)) )
# ID value
# (int) (int)
#1 1 4
#2 2 2
#3 3 4
#4 4 4
#5 5 1
或base R
方法
tapply(rowSums(!is.na(sample[-1])), sample$ID, FUN=sum)
# 1 2 3 4 5
# 4 2 4 4 1