2016-12-14 2 views
1

У меня есть dataframe, который имеет рассеяние числовые апертурыR группы путем, считая не-НС значения

toy_df 
# Y X1 X2 Label 
# 5 3 3 A 
# 3 NA 2 B 
# 3 NA NA C 
# 2 NA 6 B 

Хочу группе это, поле метки, и подсчитать, сколько не являющиеся значения NA в каждой переменной для каждой метки.

desired output: 
# Label Y X1 X2 
# A  1 1 1 
# B  2 0 2 
# C  1 0 0 

Я сделал это с помощью петли на данный момент, но это медленно и неопрятные, и я уверен, что есть лучший путь.

Агрегат, похоже, находится на полпути, но он включает в себя NA в счете.

aggregate(toy_df, list(toy_df$label), FUN=length) 

Любые идеи оценили ...

ответ

2

Мы можем использовать data.table. Преобразование 'data.frame' в 'data.table' (setDT(toy_df)), сгруппированы по 'меткой', петли через подмножество Data.table (.SD) и получить sum недействующих NA значений (!is.na(x))

library(data.table) 
setDT(toy_df)[, lapply(.SD, function(x) sum(!is.na(x))), by = Label] 
# Label Y X1 X2 
#1:  A 1 1 1 
#2:  B 2 0 2 
#3:  C 1 0 0 

Или с dplyr использованием той же методики

library(dplyr) 
toy_df %>% 
     group_by(Label) %>% 
     summarise_each(funs(sum(!is.na(.)))) 

Или в base R вариант с by в д colSums сгруппированы по 4-й колонке логической матрицы (!is.na(toy_df[-4]))

by(!is.na(toy_df[-4]), toy_df[4], FUN = colSums) 

Или с rowsum с подобным подходом, как в by за исключением того, с помощью функции rowsum.

rowsum(+(!is.na(toy_df[-4])), group=toy_df[,4]) 
# Y X1 X2 
#A 1 1 1 
#B 2 0 2 
#C 1 0 0 
1
aggregate(cbind(toy_df$Y, toy_df$X1, toy_df$X2), list(toy_df$label), 
      FUN = function (x) sum(!is.na(x))) 
2

Или в базе R

aggregate(toy_df[,1:3], by=list(toy_df$Label), FUN=function(x) { sum(!is.na(x))}) 
Смежные вопросы