R中多个数据帧的相同功能
Posted
技术标签:
【中文标题】R中多个数据帧的相同功能【英文标题】:Same function over multiple data frames in R 【发布时间】:2014-03-27 00:08:02 【问题描述】:我是 R 新手,这是一个非常简单的问题。我发现了很多与我想要的东西相似的东西,但不完全是。基本上我有多个数据框,我只想在所有数据框上运行相同的功能。一个 for 循环可以工作,但我不确定如何正确设置它来调用数据帧。它似乎也最喜欢使用 R 的 lapply 方法。我也玩过 get 函数,但无济于事。如果这是一个重复的问题,我深表歉意。任何帮助将不胜感激!
这是我过于简化的示例: 2个数据帧:df1、df2
df1
start stop ID
0 10 x
10 20 y
20 30 z
df2
start stop ID
0 10 a
10 20 b
20 30 c
我想要的是第 4 列,其中包含两个 dfs 的开始和停止平均值
df1
start stop ID Avg
0 10 x 5
10 20 y 15
20 30 z 25
我可以一次处理一个数据帧:
df1$Avg <- rowMeans(subset(df1, select = c(start, stop)), na.rm = TRUE)
但我想在所有数据帧上运行它。
【问题讨论】:
我觉得这是在正确的轨道上,我只是不能让它与上面的 rowMeans 这样的函数一起工作。 ***.com/questions/19738565/… 【参考方案1】:这是使用 for 循环的另一种可能的解决方案。几天前我遇到了同样的问题(有更多数据集),其他解决方案不起作用。 假设你有 n 个数据集:
df1 <- data.frame(start = seq(0,20,10), stop = seq(10,30,10), ID = letters[24:26])
df2 <- data.frame(start = seq(0,20,10), stop = seq(10,30,10), ID = letters[1:3])
...
dfn <- data.frame(start = seq(0,20,10), stop = seq(10,30,10), ID = letters[n:n+2])
首先要做的是列出dfs:
df.list<-lapply(1:n, function(x) eval(parse(text=paste0("df", x)))) #In order to store all datasets in one list using their name
names(df.list)<-lapply(1:n, function(x) paste0("df", x)) #Adding the name of each df in case you want to unlist the list afterwards
之后,您可以使用 for 循环(这是最重要的部分):
for (i in 1:length(df.list))
df.list[[i]][["Avg"]]<-rowMeans(df.list[[i]][1:2])
你有(如果你的列表只包括前两个数据集):
> df.list
[[1]]
start stop ID Avg
1 0 10 x 5
2 10 20 y 15
3 20 30 z 25
[[2]]
start stop ID Avg
1 0 10 a 5
2 10 20 b 15
3 20 30 c 25
最后,如果您希望将列表中修改后的数据集返回到全局环境中,您可以这样做:
list2env(df.list,.GlobalEnv)
这种技术可以应用于 n 个数据集和其他功能。 我发现它是最灵活的解决方案。
【讨论】:
【参考方案2】:将它们放入一个列表中,然后在列表上运行rowMeans
。
df1 <- data.frame(x = rep(3, 5), y = seq(1, 5, 1), ID = letters[1:5])
df2 <- data.frame(x = rep(5, 5), y = seq(2, 6, 1), ID = letters[6:10])
lapply(list(df1, df2), function(w) w$Avg <- rowMeans(w[1:2]); w )
[[1]]
x y ID Avg
1 3 1 a 2.0
2 3 2 b 2.5
3 3 3 c 3.0
4 3 4 d 3.5
5 3 5 e 4.0
[[2]]
x y ID Avg
1 5 2 f 3.5
2 5 3 g 4.0
3 5 4 h 4.5
4 5 5 i 5.0
5 5 6 j 5.5
【讨论】:
类似的 lapply(), function()) 代码如何用 lapply-function 中使用的函数重写原始日期帧?【参考方案3】:如果您希望将所有输出放在同一个文件中,这可能会有所帮助。
df1 <- data.frame(x = rep(3, 5), y = seq(1, 5, 1), ID = letters[1:5])
df2 <- data.frame(x = rep(5, 5), y = seq(2, 6, 1), ID = letters[6:10])
z=list(df1,df2)
df=NULL
for (i in z)
i$Avg=(i$x+i$y)/2
df<-rbind(df,i)
print (df)
> df
x y ID Avg
1 3 1 a 2.0
2 3 2 b 2.5
3 3 3 c 3.0
4 3 4 d 3.5
5 3 5 e 4.0
6 5 2 f 3.5
7 5 3 g 4.0
8 5 4 h 4.5
9 5 5 i 5.0
10 5 6 j 5.5
【讨论】:
【参考方案4】:制作数据框列表,然后使用 lapply 将函数应用于所有数据框。
df.list <- list(df1,df2,...)
res <- lapply(df.list, function(x) rowMeans(subset(x, select = c(start, stop)), na.rm = TRUE))
# to keep the original data.frame also
res <- lapply(df.list, function(x) cbind(x,"rowmean"=rowMeans(subset(x, select = c(start, stop)), na.rm = TRUE)))
然后,lapply 将按顺序将每个数据帧作为 x 输入。
【讨论】:
以上是关于R中多个数据帧的相同功能的主要内容,如果未能解决你的问题,请参考以下文章
对具有相同结构的几个数据集使用lapply并可能进行for循环以提取和计算每个数据帧的值
R如何排列数据帧的所有行,以便在列表中返回所有可能的行组合?