根据两个变量匹配数据帧行(索引)

时间:2011-02-02 19:12:22

标签: r join merge dataframe

我基本上试图将无组织的数据变成长形式的线性建模。

我有2个data.frames“rec”和“book”

“book”中的每一行都需要根据行中的两个变量粘贴到几行“rec”的末尾:“MRN”和“COURSE”匹配。

我尝试过以下内容并对其进行修改无济于事:

i=1
newlist=list()
colnames(newlist)=colnames(book)
for ( i in 1:dim(rec)[1]) {
    mrn=as.numeric(as.vector(rec$MRN[i]));
    course=as.character(rec$COURSE[i]);
get.vector<-as.vector(((as.numeric(as.vector(book$MRN))==mrn) & (as.character(book$COURSE)==course)))
newlist[i]<-book[get.vector,] 
i=i+1;
}

如果有人对

有任何建议

1)让这个工作 2)使它更优雅(或者可能只是不那么笨拙)

如果我不清楚,请求你的赦免。

我知道我没有合并上面的任何数据,我想如果我能生成一个长格式的data.frame我可以自己组合它们

2 个答案:

答案 0 :(得分:7)

听起来你需要merge这两个数据帧。试试这个:

merge(rec, book, by = c('MRN', 'COURSE'))

并阅读merge的帮助(通过在R控制台上执行?merge)以获取有关如何合并这些内容的更多选项。

答案 1 :(得分:2)

我创建了一个可以帮助您的简单示例。在我的情况下,我想根据变量x1和x2在df2的每一行中粘贴df1中的'value'列:

df1 <- read.table(textConnection("
x1 x2 value
1 2 12
1 3 56
2 1 35
2 2 68
"),header=T)

df2 <- read.table(textConnection("
test x1 x2
1 1 2
2 1 3
3 2 1
4 2 2
5 1 2
6 1 3
7 2 1
"),header=T)

library(sqldf)
sqldf("select df2.*, df1.value from df2 join df1 using(x1,x2)")

  test x1 x2 value
1    1  1  2    12
2    2  1  3    56
3    3  2  1    35
4    4  2  2    68
5    5  1  2    12
6    6  1  3    56
7    7  2  1    35