我有一个纵向数据帧:
id= rep(1:3,each= 3)
a_yr = rep(1994:1996,3)
b_yr = c(1994,1995,1997,1994,1998,2001,1994,1997, 1998)
x= 1:9
df= data.frame(id,a_yr,b_yr,x)
ids a_yr b_yr x
1 1 1994 1994 1
2 1 1995 1995 2
3 1 1996 1997 3
4 2 1994 1994 4
5 2 1995 1998 5
6 2 1996 2001 6
7 3 1994 1994 7
8 3 1995 1997 8
9 3 1996 1998 9
我想创建一个子集,其中包含第一个a_yr
匹配的行b_yr
每个 id:
ids a_yr b_yr x
2 1 1994 1994 1
4 2 1994 1994 4
7 3 1994 1994 7
我尝试使用lapply
函数:
lapply(unique(df$id), function(i){
data= df[which(df$id==i),]
rownames(data)<- data$a_yr
ind = data[1,"b_yr"]
dat= data[ind,]
})
但它返回了一堆NA
。
[[1]]
id a_yr b_yr x
NA NA NA NA NA
[[2]]
id a_yr b_yr x
NA NA NA NA NA
[[3]]
id a_yr b_yr x
NA NA NA NA NA
我想知道如何在函数中索引行lapply
或任何其他解决此问题的更好方法。谢谢!
在基本 R 中:
df[df$a_yr==df$b_yr,]
id a_yr b_yr x
2 1 1995 1995 2
4 2 1994 1994 4
7 3 1994 1994 7
有很多
方法,这里有一个:
library(dplyr)
df %>% group_by(id) %>% filter(a_yr==b_yr)
# id a_yr b_yr x
# (int) (int) (dbl) (int)
#1 1 1995 1995 2
#2 2 1994 1994 4
#3 3 1994 1994 7
带data.table
library(data.table)
setDT(df)[a_yr==b_yr]