R函数which.max与tapply

Lov*_*eow 4 r which tapply

我试图通过一个因子创建一个具有最大记录数据的数据框.我想要一个4行数据帧(每个G一个),该组中X的最大值和相应的Y值.我知道我可以写一个循环但不愿意.

Data<-data.frame(X=rnorm(200), Y=rnorm(200), G=rep(c(1,2,3,4), each=50))
XMax<-tapply(Data$X, Data$G, function(x){max(x, na.rm=T)})
WhichXMax<-tapply(Data$X, Data$G, function(x){which.max(x)})
Run Code Online (Sandbox Code Playgroud)

which.max函数在数据被tapply因子子集化后返回行号,我真的希望行号引用数据行.所以我可以这样做;

YMax<-Data$Y[Which]
MaxData<-data.frame(XMax=XMax, YMax=YMax, G=levels(Data$G))
Run Code Online (Sandbox Code Playgroud)

Exp*_*teR 7

library(dplyr)
Data %>% 
    group_by(G) %>% 
    filter(X==max(X))
Run Code Online (Sandbox Code Playgroud)

如果你不想包括领带,那么

Data %>%
    group_by(G) %>%
    arrange(desc(X)) %>%
    slice(1)
Run Code Online (Sandbox Code Playgroud)


the*_*ail 6

您可以使用by和引用rownames返回的行which.max:

Data[by(Data, Data$G, function(dat) rownames(dat)[which.max(dat$X)] ),]

#           X          Y G
#4   1.595281 -0.3309078 1
#61  2.401618  0.9510128 2
#147 2.087167  0.9160193 3
#171 2.307978 -0.3887222 4
Run Code Online (Sandbox Code Playgroud)

(这假定 set.seed(1)为了重现性)


use*_*710 5

  library(data.table)
  set.seed(1)
  Data<-data.frame(X=rnorm(200), Y=rnorm(200), G=rep(c(1,2,3,4), each=50))
  setDT(Data)[,list(X=max(X),Y=Y[which.max(X)]),by=G]
   G        X          Y
1: 1 1.595281 -0.3309078
2: 2 2.401618  0.9510128
3: 3 2.087167  0.9160193
4: 4 2.307978 -0.3887222
Run Code Online (Sandbox Code Playgroud)

  • 更简单:`setDT(数据)[,.SD [which.max(X)],by = G]` (4认同)