2016-01-27 2 views
0

Я только начинаю изучать 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 

Есть ли способ сделать это, что я не хватает? Я попробовал count (complete.cases (sample)) с plyr и sum (complete.cases()), но это не дает мне то, что я на самом деле хочу.

Любая помощь с этим оценивается.

+0

Вы можете получить немного творчески ddply функции plyr и добраться до нужного результата. образец $ num_valid_score.1 <- ifelse (! Is.na (оценка 1), 1,0) образец $ num_valid_score.2 <- ifelse (! Is.na (оценка 2), 1,0) sample $ total_valid <- sample $ num_valid_score.1 + sample $ num_valid_score.2 ddply (sample, c ("ID"), суммировать, Complete = sum (total_valid)) – JJFord3

ответ

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

Это следует сделать это:

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 выбирает строки, в которых счет 2 (хотя и не обязательно оценка 1) завершен. поэтому, подсчитывая, сколько раз ID появляется в total, вы получаете, сколько раз оценка 1 завершена для этого идентификатора +, сколько раз оценка 2. завершена для этого идентификатора, который вы хотите.

1

с пакетом dplyr и базовой функции complete.cases, попробуйте

require(dplyr) 
sample %>% 
    mutate(complete = complete.cases(sample)) %>% 
    group_by(ID) %>% 
    summarise(complete = sum(complete)) 
1

Вот еще один вариант с gather/summarise. Мы конвертируем формат «широкий» в «длинный» с gather (от tidyr), получаем sum не-NA 'значение', сгруппированное по '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 
Смежные вопросы