将新数据帧与单个数据帧匹配到多个数据帧

时间:2015-08-14 07:55:17

标签: r

我有一个Pincode值的数据框(file1.csv)。

在另一组中,我有多个具有相同记录集的文件(fileset1.csv,fileset2.csv,fileset3.csv(。

我想根据file1将匹配的pincode与多个文件中的行集拉出来。

例如:

我希望所有文件的所有行的pincode和delivery%是一个单独的数据框,用file1.csv的pincode文件索引。

提前致谢。

file1.csv

Pincode        Name        value
110011         sia           N
110012         dia           S
110013         sia           W

fileset1.csv

Pincode     Orders   Delivery   Delivery%
110011      56         30          22.26
110044      80         20          35.26
110011      86         30          45.62

fileset2.csv

Pincode     Orders   Delivery   Delivery%
110011      106         30           12.26
110044      650         220          55.26
110011      862         130          35.62

fileset3.csv

Pincode     Orders   Delivery   Delivery%
110011      567         70          12.26
110044      801         30          25.26
110011      86         80           95.62

预期产出:

Pincode          Delivery%
110011           Totalvalue of all (22.26+45.62+12.26+35.62+12.26+95.62)

1 个答案:

答案 0 :(得分:0)

我们可以将数据框放在list('lst')中,然后将'key'数据集('d1')中的'Pincode'列与每个data.frame'进行比较'lst'中的Pincode'列使用%in%subset来自%in%的逻辑索引的数据集行。我们可以rbindlist改为data.framerbindlist。在这里,我使用了来自data.table的{​​{1}}。然后,我们可以获得由'Pincode'分组的'Delivery %`列的sum

lst <- list(df1, df2, df3)
lst1 <- lapply(lst, function(x) 
              x[x$Pincode %in%d1$Pincode,c('Pincode', 'Delivery%')]))
library(data.table)
rbindlist(lst1)[,list(Delivery=sum(`Delivery%`)) , by = Pincode]
#  Pincode Delivery
#1:  110011   223.64

我不确定OP是否有读取数据集。要阅读数据集,我们可以使用read.csv/read.table中的freaddata.table?read.csv和其他人的帮助页面有一些示例可以指导它们是否已经完成。

数据

d1 <- structure(list(Pincode = 110011:110013, Name = c("sia", "dia", 
"sia"), value = c("N", "S", "W")), .Names = c("Pincode", "Name", 
"value"), class = "data.frame", row.names = c(NA, -3L))

df1 <- read.table(text="Pincode     Orders   Delivery   Delivery%
110011      56         30          22.26
110044      80         20          35.26
110011      86         30          45.62", 
           sep="", header=TRUE, check.names=FALSE)




df2 <- read.table(text="Pincode     Orders   Delivery   Delivery%
110011      106         30           12.26
110044      650         220          55.26
110011      862         130          35.62", 
            sep="", header=TRUE, check.names=FALSE)


df3 <- read.table(text="Pincode     Orders   Delivery   Delivery%
110011      567         70          12.26
110044      801         30          25.26
110011      86         80           95.62",
            sep="", header=TRUE, check.names=FALSE)