2016-02-09 48 views
1

我有一個縱向數據幀:表示在數據幀行lapply功能

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 s。

[[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功能或任何其他更好的方法來解決這個問題,不知道如何索引行。 非常感謝!

+1

這應該給你想要的東西:'DF [df $ a_yr == df $ b_yr,]' – Jaap

+0

您的示例和預期輸出不匹配。 – akrun

回答

1

在基礎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 
0

有很多方法,這裏是一個:

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 
0

隨着data.table

library(data.table) 
setDT(df)[a_yr==b_yr]