2015-11-12 3 views
3

У меня есть Rdata.tableМаксимальное значение одного столбца data.table на основе других столбцов

DT = data.table(x=rep(c("b","a",NA_character_),each=3), y=rep(c('A', NA_character_, 'C'), each=3), z=c(NA_character_), v=1:9) 
DT 
# x y z v 
#1: b A NA 1 
#2: b A NA 2 
#3: b A NA 3 
#4: a NA NA 4 
#5: a NA NA 5 
#6: a NA NA 6 
#7: NA C NA 7 
#8: NA C NA 8 
#9: NA C NA 9 

Для каждого столбца, если значение не NA, я хочу, чтобы извлечь максимальное значение из колонки v. Я использую

sapply(DT, function(x) { ifelse(all(is.na(x)), NA_integer_, max(DT[['v']][!is.na(x)])) }) 
#x y z v 
#6 9 NA 9 

Есть ли более простой способ достичь этого?

ответ

3

вот способ, давая вам -Inf (и предупреждение), если все значения столбца NA (позже можно заменить что NA, если вы предпочитаете):

DT[, lapply(.SD, function(x) max(v[!is.na(x)]))] 
# x y z v 
# 1: 6 9 -Inf 9 

Как было предложено @DavidArenburg , чтобы убедиться, что все идет хорошо, даже если все значения не NA (без предупреждения и непосредственно NA как результат), вы можете сделать:

DT[, lapply(.SD, function(x) { 
    temp <- v[!is.na(x)] 
    if(!length(temp)) NA else max(temp) 
})] 
# x y z v 
#1: 6 9 NA 9 
+2

благодарит @DavidArenburg и благодарит за более надежный способ, я добавлю это! – Cath

+0

Спасибо. Но разве это не так, как сейчас. – imsc

+1

Существует также аргумент 'na.rm'' max' (который быстрее, чем подмножество и принятие max). – nicola

1

Мы можем использовать summarise_each от dplyr

library(dplyr) 
DT %>% 
    summarise_each(funs(max(v[!is.na(.)]))) 
# x y z v 
#1: 6 9 -Inf 9 
+0

ПРИМЕЧАНИЕ: Я был бы счастлив использовать '%> % 'и остальное в 2 строках вместо того, чтобы перебирать все в строке и называть его« однострочным » – akrun

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