R中两个数据帧中的公共数据/样本

时间:2014-08-08 09:58:02

标签: r dataframe

我试图比较来自两个不同模型的基于模型的预测。然而,型号2需要更多的非缺失数据,因此比模型1具有更多的缺失值(NA)。

我现在想知道如何快速查询两个数据帧的非缺失值并识别常见样本?我曾经使用excel和函数

=IF(AND(ISVALUE(a1);ISVALUE(b1));then;else) 

出现在我的脑海中,但我不知道如何正确地使用R。

这是我的模型1的df:每个观察都通过id和时间清楚地识别。 (左边的rownumbers来自我的整个数据帧,并且在两个数据帧中都是相同的。)

> head(model1)
   id time        f1         f2          f3          f4          f5
9   1 1995 16.351261  -1.856662    6.577671  10.7883178  22.5349438
10  1 1996 15.942914  -1.749530    2.894190   0.6058255   1.7057163
11  1 1997 24.187390  15.099166   14.275441  -4.9963831  -0.1866863
12  1 1998  3.101094 -10.455754   -9.674086  -9.8456466  -8.5525140
13  1 1999 33.562234   2.610512  -15.237620 -18.8095980 -17.6351989
14  1 2000 59.979666 -45.106093 -100.352866 -56.6137325 -32.0315737

和这个模型2:

> head(model2)
   id time meanf1 meanf2 meanf3 meanf4 meanf5
9   1 1995   4.56   5.14   6.05     NA     NA
10  1 1996   4.38   4.94     NA     NA     NA
11  1 1997   4.05   4.51     NA     NA     NA
12  1 1998   4.07   5.04   6.52     NA     NA
13  1 1999   3.61   4.96     NA     NA     NA
14  1 2000   4.35   4.83   6.46     NA     NA

感谢您的帮助和提示。

1 个答案:

答案 0 :(得分:2)

函数complete.cases为所有列提供了非缺失数据。集合(f4,meanf4)和(f5,meanf5)在样本数据中没有“共同的”非缺失值,因此没有观察结果。这是你在寻找什么

#Read Data
model1=read.table(text='id time        f1         f2          f3          f4          f5
   1 1995 16.351261  -1.856662    6.577671  10.7883178  22.5349438
   1 1996 15.942914  -1.749530    2.894190   0.6058255   1.7057163
   1 1997 24.187390  15.099166   14.275441  -4.9963831  -0.1866863
   1 1998  3.101094 -10.455754   -9.674086  -9.8456466  -8.5525140
   1 1999 33.562234   2.610512  -15.237620 -18.8095980 -17.6351989
   1 2000 59.979666 -45.106093 -100.352866 -56.6137325 -32.0315737',header=TRUE)

model2=read.table(text='   id time meanf1 meanf2 meanf3 meanf4 meanf5
1 1995   4.56   5.14   6.05     NA     NA
1 1996   4.38   4.94     NA     NA     NA
1 1997   4.05   4.51     NA     NA     NA
1 1998   4.07   5.04   6.52     NA     NA
1 1999   3.61   4.96     NA     NA     NA
1 2000   4.35   4.83   6.46     NA     NA',header=TRUE)




#name indices of f1..f5 = 3..7
#merge data for each f1..f5 and keep only non-missing values using, complete.cases()

DF_list = lapply(3:7,function(x) {   
            DF=merge(model1[,c(1,2,x)],model2[,c(1,2,x)],by=c("id","time"));
            DF=DF[complete.cases(DF),]; 
            return(DF);
          })

DF_list
#[[1]]
#  id time        f1 meanf1
#1  1 1995 16.351261   4.56
#2  1 1996 15.942914   4.38
#3  1 1997 24.187390   4.05
#4  1 1998  3.101094   4.07
#5  1 1999 33.562234   3.61
#6  1 2000 59.979666   4.35
#
#[[2]]
#  id time         f2 meanf2
#1  1 1995  -1.856662   5.14
#2  1 1996  -1.749530   4.94
#3  1 1997  15.099166   4.51
#4  1 1998 -10.455754   5.04
#5  1 1999   2.610512   4.96
#6  1 2000 -45.106093   4.83
#
#[[3]]
#  id time          f3 meanf3
#1  1 1995    6.577671   6.05
#4  1 1998   -9.674086   6.52
#6  1 2000 -100.352866   6.46
#
#[[4]]
#[1] id     time   f4     meanf4
#<0 rows> (or 0-length row.names)
#
#[[5]]
#[1] id     time   f5     meanf5
#<0 rows> (or 0-length row.names)