gpt4 book ai didi

R-保留由多个变量标识的每个组的第一个观察值(Stata等效 "bys var1 var2 : keep if _n == 1")

转载 作者:行者123 更新时间:2023-12-04 11:03:42 24 4
gpt4 key购买 nike

所以我目前在R中遇到一个我完全知道如何在Stata中处理的问题,但是却浪费了两个多小时来完成R中的工作。

使用下面的data.frame,我想要的结果是确切地获得每个组的第一个观察值,而组是由多个变量组成的,并且必须由另一个变量进行排序,即通过以下方式获得的data.frame mydata:

id <- c(1,1,1,1,2,2,3,3,4,4,4)
day <- c(1,1,2,3,1,2,2,3,1,2,3)
value <- c(12,10,15,20,40,30,22,24,11,11,12)
mydata <- data.frame(id, day, value)

应转换为:
   id day value   
1 1 10
1 2 15
1 3 20
2 1 40
2 2 30
3 2 22
3 3 24
4 1 11
4 2 11
4 3 12

通过仅保留具有一个或多个重复组标识符的行中的一行(此处仅是 row[1]: (id,day)=(1,1)),首先对值进行排序(以便保留值最低的行)。

在Stata中,这将简单地是:
bys id day (value): keep if _n == 1

我找到了一个 piece of code on the web,如果我首先生成一个组标识符,则可以正确地做到这一点:
mydata$id1 <- paste(mydata$id,"000",mydata$day, sep="")  ### the single group identifier

myid.uni <- unique(mydata$id1)
a<-length(myid.uni)

last <- c()

for (i in 1:a) {
temp<-subset(mydata, id1==myid.uni[i])
if (dim(temp)[1] > 1) {
last.temp<-temp[dim(temp)[1],]
}
else {
last.temp<-temp
}
last<-rbind(last, last.temp)
}

last

但是,这种方法存在一些问题:
1.需要创建一个标识符(可以快速完成)。
2.与Stata中的单行代码相比,这似乎是一件繁琐的代码。
3.在一个中等大小的数据集(少于100,000个观察值,以大约6的数量为一组)中,此方法将花费大约1.5个小时。

是否有任何等效于Stata的 bys var1 var2: keep if _n == 1的有效方法?

最佳答案

我会命令data.frame,此时您可以使用by进行调查:

mydata <- mydata[with(mydata, do.call(order, list(id, day, value))), ]

do.call(rbind, by(mydata, list(mydata$id, mydata$day),
FUN=function(x) head(x, 1)))

或者,查看“data.table”包。从上面继续订购的 data.frame:
library(data.table)

DT <- data.table(mydata, key = "id,day")
DT[, head(.SD, 1), by = key(DT)]
# id day value
# 1: 1 1 10
# 2: 1 2 15
# 3: 1 3 20
# 4: 2 1 40
# 5: 2 2 30
# 6: 3 2 22
# 7: 3 3 24
# 8: 4 1 11
# 9: 4 2 11
# 10: 4 3 12

或者,从头开始,您可以通过以下方式使用 data.table:
DT <- data.table(id, day, value, key = "id,day")
DT[, n := rank(value, ties.method="first"), by = key(DT)][n == 1]

并且,通过扩展,在基数R中:
Ranks <- with(mydata, ave(value, id, day, FUN = function(x) 
rank(x, ties.method="first")))
mydata[Ranks == 1, ]

关于R-保留由多个变量标识的每个组的第一个观察值(Stata等效 "bys var1 var2 : keep if _n == 1"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21553235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com