【问题标题】:Match dataframe rows according to two variables (Indexing)根据两个变量匹配数据框行(索引)
【发布时间】:2011-06-20 05:02:30
【问题描述】:

我实际上是在尝试将杂乱无章的数据转换为长格式以进行线性建模。

我有 2 个数据帧“rec”和“book”

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

我尝试了以下方法和变体均无济于事:

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,我可以自己将它们全部合并

【问题讨论】:

    标签: r join merge dataframe


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我创建了一个可能对您有所帮助的简单示例。就我而言,我想根据变量 x1 和 x2 将 df1 中的“值”列粘贴到 df2 的每一行中:

      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
      

      【讨论】:

      • 最后一条语句可以缩短为sqldf("select * from df2, df1 using(x1, x2)")
      • m1
      猜你喜欢
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 2018-07-13
      • 2021-09-19
      • 1970-01-01
      • 2020-01-21
      • 2017-11-03
      相关资源
      最近更新 更多