R-保留由多个变量标识的每个组的第一个观察值(Stata等效值由var1 var2:Keep if_n==1";) [英] R - Keep first observation per group identified by multiple variables (Stata equivalent "bys var1 var2 : keep if _n == 1")
本文介绍了R-保留由多个变量标识的每个组的第一个观察值(Stata等效值由var1 var2:Keep if_n==1";)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
所以我目前在R中遇到了一个问题,我知道如何在Stata中处理,但在R中浪费了两个多小时才完成。
使用下面的data.Frame,我想要的结果是正好获得每个组的第一个观测值,而组是由多个变量组成的,必须按另一个变量进行排序,即数据。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等效值由var1 var2:Keep if_n==1";)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文