2014-10-30 7 views
0

Я пытаюсь обобщить (принять среднее значение) различных столбцов на основе одного столбца в таблице данных.data.table дает NA при суммировании по столбцам

Вот игрушка пример моих данных и код, который я использовал, который показывает проблема, у меня:

library(data.table) 
a<- data.table(
    a=c(1213.1,NA,113.41,133.4,121.1,45.34), 
    b=c(14.131,NA,1.122,113.11,45.123,344.3), 
    c=c(101.2,NA,232.1,194.3,12.12,7645.3), 
    d=c(11.32,NA,32.121,94.3213,1223.1,34.1), 
    e=c(1311.32,NA,12.781,13.2,2.1,623.2), 
    f=c("A", "B", "B", "A", "B", "X")) 
a 
setkey(a,f) # column "f" is what I want to summarize columns by 

a[, lapply(.SD, mean), by=f, .SDcols=c(1:4)] # I just want to summarize first 4 columns 

Выход последней строки:

> a[, lapply(.SD, mean), by=f, .SDcols=c(1:4)] 
f a b c d 
1: A 673.25 63.6205 147.75 52.82065 
2: B NA NA NA NA 
3: X 45.34 344.3000 7645.30 34.10000 

Почему данные B NA? Не следует ли игнорировать NA при вычислении среднего значения? Я думаю, что нашел аналогичную проблему here, но, возможно, это совсем другое и/или у меня есть синтаксис.

Если это невозможно в data.table, я открыт для других предложений.

+1

Игнорирование 'NA's, вам нужен аргумент' na.rm = true'. Попробуйте 'a [, lapply (.SD, mean, na.rm = TRUE), by = f, .SDcols = c (1: 4)]' – ialm

+0

ah. так просто. можете ли вы написать это? Я дам вам очки – Prophet60091

ответ

2

В R по умолчанию функция mean() предназначена для вывода NA, если отсутствуют значения. Чтобы игнорировать NA s в среднем вычислении, вам необходимо установить аргумент na.rm=TRUE. lapply принимает дополнительные аргументы функции она передается, поэтому для вашей проблемы, вы можете попробовать

a[, lapply(.SD, mean, na.rm=TRUE), by=f, .SDcols=c(1:4)]

+0

Извините, но почему это не вопрос 'data.table' (я вернул тэг в Q)? : -O – Arun

+0

Потому что это просто совпадение, что это поведение наблюдалось в data.table; даже без 'library (data.table)' среднее значение столбца, содержащего 'NA', по-прежнему остается' NA'. – Hugh

+0

@Hugh, он помогает (будущим) пользователям с тем же вопросом быстро идентифицировать этот ответ с помощью тега data.table. Вопрос под названием «data.table дает ...». Было бы трудно для людей, которые действительно не понимают, что происходит, чтобы искать весь тег R. – Arun

Смежные вопросы