R 函数 which.max with tapply
R function which.max with 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)})
which.max 函数 returns 数据被 tapply 因子子集后的行号,我真的希望行号引用数据行。所以我可以做类似的事情;
YMax<-Data$Y[Which]
MaxData<-data.frame(XMax=XMax, YMax=YMax, G=levels(Data$G))
library(dplyr)
Data %>%
group_by(G) %>%
filter(X==max(X))
如果您不想包含平局,那么
Data %>%
group_by(G) %>%
arrange(desc(X)) %>%
slice(1)
您可以使用 by
并引用 which.max
返回的行的 rownames
:
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
(为了再现性,假设 set.seed(1)
)
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
我正在尝试制作一个数据框,该数据框的最大记录数为一个因子。我想要一个包含 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)})
which.max 函数 returns 数据被 tapply 因子子集后的行号,我真的希望行号引用数据行。所以我可以做类似的事情;
YMax<-Data$Y[Which]
MaxData<-data.frame(XMax=XMax, YMax=YMax, G=levels(Data$G))
library(dplyr)
Data %>%
group_by(G) %>%
filter(X==max(X))
如果您不想包含平局,那么
Data %>%
group_by(G) %>%
arrange(desc(X)) %>%
slice(1)
您可以使用 by
并引用 which.max
返回的行的 rownames
:
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
(为了再现性,假设 set.seed(1)
)
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