跨数据框进行矢量化

问题描述 投票:0回答:2

我有一个从各种csv文件中读取的数据帧列表。每个数据帧具有相同的格式(即,列是相同的)。

myList <- list(frame1, frame2, ..., frameN)

我经常需要对每个数据帧中的相应列执行一些计算,例如对给定日期(行)中每个数据帧中的所有工资列求和。

day <- 1
dailyTotal <- NULL

for(i in 1:N){
    dailyTotal <- dailyTotal + myList[[i]]$Salary[day]
}

我想知道在没有for循环的情况下是否有更好的矢量化方法吗?

r
2个回答
2
投票

您真的应该考虑将数据帧重新绑定到一个大型数据框中,然后可以在其上执行拆分应用组合样式分析。

首先在列表中创建5个data.frames(使用cols name和salary)以尝试复制数据:

dfs <- replicate(5, data.frame(name=sample(letters, 10), salary=runif(10, 50000,100000)), simplify=F)

现在rbind他们成为一个大型数据框架,额外的列df.name来代表原始数据框架

dfs.bound <- do.call(rbind, mapply(cbind, df.name=paste("DF# ", 1:length(dfs)), dfs, SIMPLIFY=F)) 
str(dfs.bound)
# 'data.frame':  50 obs. of  3 variables:
# $ df.name: Factor w/ 5 levels "DF#  1","DF#  2",..: 1 1 1 1 1 1 1 1 1 1 ...
# $ name   : Factor w/ 21 levels "a","g","h","j",..: 5 2 4 10 8 1 9 6 3 7 ...
# $ salary : num  94666 74596 78793 77120 60251 ...

并且拆分应用组合(显示三种方法,qazxsw poi只用一列,和qazxsw poi / qazxsw poi,它与许多一起工作):

tapply

使用plyrdata.table,我们可以添加更多列,以及不同的摘要统计信息。

tapply(dfs.bound$salary, dfs.bound$df.name, mean)
#   DF#  1   DF#  2   DF#  3   DF#  4   DF#  5  
# 74342.26 68222.44 71881.49 75840.18 63180.07 

1
投票

与@ BrodieG的方法相比,将数据保持为列表是有利有弊的。这取决于你想在分析的其他部分做什么等。所以这里是将数据保存为列表的方法:

plyr
© www.soinside.com 2019 - 2024. All rights reserved.