2017-01-25 2 views
4

Например, у меня есть этот фрейм данных (DF):номера граф не-NA в колонке и вывода данных кадра

Color X1  X2 X3 X4 
Red  1  1  0  2 
Blue  0  NA 4  1 
Red  3  4  3  1 
Green 2  2  1  0 

Я хотел бы создать функцию, которая подсчитывает количество не- NA в X2 как функция цвета. Я хотел бы получить эту функцию в новом фрейме данных с именем newdf. Это то, что я хотел бы для вывода:

Color X2  
Red  2  
Blue  NA  
Green 1 

До сих пор, у меня есть этот код:

Question <- function(Color){ 
    Result <- 
    rowsum((df[c("X2")] > 0) + 0, df[["X2"]], na.rm = TRUE) 
    rowSums(Result)[[Color]] 
    } 
    Question("Red") 

Выход эта функция дает это просто Question("Red")= 2, и я хотел бы, чтобы вместо того, чтобы получить мои результаты всех цвета в новом фрейме данных (newdf). Может кто-нибудь помочь с этим? Благодаря!

+1

Вы также можете иметь именованный вектор 'tapply (IfElse (это .na (df $ X2), NA, 1), df $ Color, FUN = sum) ' – jogo

+1

с использованием' rowsum: '' rowsum (as.numeric (! is.na (dt $ X2)), dt $ Color) ' – user20650

ответ

4

Или, если вы хотите использовать data.table:

library(data.table) 

dt[,sum(!is.na(X2)),by=.(Color)] 

    Color V1 
1: Red 2 
2: Blue 0 
3: Green 1 

Кроме того, его достаточно легко использовать ifelse() в таблице data.table, чтобы получить NA для синего, а не 0. См.:

dt[,ifelse(sum(!is.na(X2)==0),as.integer(NA),sum(!is.na(X2))),by=.(Color)] 

    Color V1 
1: Red 2 
2: Blue NA 
3: Green 1 

данных:

dt <- as.data.table(fread("Color X1  X2 X3 X4 
Red  1  1  0  2 
Blue  0  NA 4  1 
Red  3  4  3  1 
Green 2  2  1  0")) 
3
library(dplyr) 
df1 <- df %>% 
      group_by(Color) %>% 
      summarise(sum(!is.na(X2))) 
df1 
# (chr)   (int) 
#1 Red    2 
#2 Blue    0 
#3 Green    1 

и если вы действительно хотите NA вместо этого 0 затем

df1[df1 ==0]<-NA 
0

С базой R мы можем использовать aggregate с na.action параметром как na.pass, чтобы NA значения

aggregate(X2~Color, df, function(x) sum(!is.na(x)), na.action = na.pass) 

# Color X2 
#1 Blue 0 
#2 Green 1 
#3 Red 2 
Смежные вопросы