如何从R中的两个数据帧中选择匹配的行

时间:2019-03-15 02:59:03

标签: r

     public static char stringIterator(String string) {
     char lastChar = string.charAt(0);
       for(int i = string.length()-1 ;i>=0;i--) {
           System.out.println(string);//Keep this line
           lastChar = string.charAt(i);
           if (string.length() == 1 || lastChar == 'M') {
              break;
           } else {
              string = string.substring(0, i);
           }
        }
        return lastChar;
      }

我想从df1和df2中选择第1行。 df1和df2中的第2行。 df1和df2的第3行。 df1和df2的第4行。我可以使用下面的代码来做到这一点,但想知道当有数百行时是否有更简单的方法来做到这一点?我总是从两个df中寻找匹配的行,并希望将它们配对。

> df1
     n1 mt1
1  Mike  48
2  John  64
3 Steve  32
4   Dan  87

> df2
       n1 mt1
1   Peter  32
2   Chris  23
3 Brendan  44
4  Joseph  52

3 个答案:

答案 0 :(得分:3)

我们可以从基数R中使用Map并为df1df2子集以及rbind创建一个行索引序列。但是,请确保df1df2的行数相等,否则可能会得到一些意外的结果。

Map(function(x, y) rbind(df1[x, ], df2[x, ]), 1:nrow(df1), 1:nrow(df2))

#[[1]]
#      n1 mt1
#1   Mike  48
#11 Peter  32

#[[2]]
#      n1 mt1
#2   John  64
#21 Chris  23

#[[3]]
#        n1 mt1
#3    Steve  32
#31 Brendan  44

#[[4]]
#       n1 mt1
#4     Dan  87
#41 Joseph  52

我们还可以将每一行split放入数据帧列表,然后rbind

Map(rbind, split(df1, 1:nrow(df1)), split(df2, 1:nrow(df2)))

purrr版本是

purrr::map2(split(df1, 1:nrow(df1)), split(df2, 1:nrow(df2)), rbind)

由于行数相同,我们也可以使用lapply

lapply(1:nrow(df1), function(x) rbind(df1[x, ], df2[x, ]))

答案 1 :(得分:2)

使用split

df=rbind(df1,df2)
split(df,rep((seq.int(nrow(df1))),2)) # or split(df,c(seq.int(nrow(df1)),seq.int(nrow(df2))))
$`1`
      n1 mt1
1   Mike  48
11 Peter  32

$`2`
      n1 mt1
2   John  64
21 Chris  23

$`3`
        n1 mt1
3    Steve  32
31 Brendan  44

$`4`
       n1 mt1
4     Dan  87
41 Joseph  52

答案 2 :(得分:0)

另一种直观的实现方法是使用for循环

df1 <- data.frame(n1=c('Mike','John','Steve','Dan'),
                  mt1=c(48,64,32,87), stringsAsFactors = F)
df2 <- data.frame(n1=c('Peter','Chris','Brendan','Joseph'),
                  mt1=c(32,23,44,52), stringsAsFactors = F)
for (i in 1:nrow(df1)) {
  assign(paste0("m", i), rbind(df1[i, ], df2[i, ]))
}

这将创建几个新的数据帧-在这种情况下为m1,m2,m3和m4-每个数据帧都具有来自df1和df2的相应行。