从n个数据帧中取一行并创建一个新的数据帧,其中包含行R

时间:2016-09-19 21:53:28

标签: r dataframe

假设我有2个数据帧。我想从每个数据帧中选择一行,让我们说行业c3,并将它们放在另一个data.frame,df3中。

df1 = data.frame(Industries = c("c1", "c2", "c3", "c4", "c5"), Exports = c(100, 40, 30, 10, 50), Imports =c(90,50,25,15,50))
df2 = data.frame(Industries = c("c1", "c2", "c3", "c4", "c5"), Exports = c(20, 90, 10, 30, 60), Imports =c(40,30,25,55,40))

df1
      Industries Exports Imports
    1         c1     100      90
    2         c2      40      50
    3         c3      30      25
    4         c4      10      15
    5         c5      50      50
df2
      Industries Exports Imports
    1         c1      20      40
    2         c2      90      30
    3         c3      10      25
    4         c4      30      55
    5         c5      60      40

在我的实际数据中,我有16个不同的数据帧,因此如果可能,代码应该允许将16个数据帧中的16行放入另一个数据帧中,这将被创建。

2 个答案:

答案 0 :(得分:0)

假设您的列始终相同,您可以使用dplyr和purrr包执行以下操作:

library(purrr)
library(dplyr)

df1 = data.frame(Industries = c("c1", "c2", "c3", "c4", "c5"), Exports = c(100, 40, 30, 10, 50), Imports =c(90,50,25,15,50))
df2 = data.frame(Industries = c("c1", "c2", "c3", "c4", "c5"), Exports = c(20, 90, 10, 30, 60), Imports =c(40,30,25,55,40))

list(df1, df2) %>% map_df(~ filter(., Industries == "c3"))
#>   Industries Exports Imports
#> 1         c3      30      25
#> 2         c3      10      25
  • list(df1, df2)正在将您的数据框组合成一个列表
  • map_df对每个进行迭代,承诺(如果可能)将结果作为数据框返回。
  • ~ filter(., Industries == "c3")是在每个数据框上运行的函数,它仅返回Industries == "c3"的行。

答案 1 :(得分:0)

我们可以使用data.table。将数据集放在list mgetpasterbind数据集listrbindlist)中,设置'关键字'作为'Industries'并将列

中具有'c3'的行子集化
library(data.table)
setkey(rbindlist(mget(paste0("df", 1:2))), "Industries")["c3"]
#   Industries Exports Imports
#1:         c3      30      25
#2:         c3      10      25