按ID计算几个变量的完整案例

时间:2016-01-27 21:41:45

标签: r

我刚刚开始学习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)),但是它没有给我实际想要的东西。

对此有任何帮助表示赞赏。

4 个答案:

答案 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