簡體   English   中英

基於其他列的一個data.table列的最大值

[英]Maximum value of one data.table column based on other columns

我有一個R 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

是否有更簡單的方法來實現這一目標?

這是一種方法,如果列的所有值都是NA ,則給你-Inf (和警告)(如果你願意,你可以稍后用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

我們可以使用summarise_eachdplyr

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM