我是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)
但我想在所有数据帧上运行它。
答案 0 :(得分:10)
制作数据框列表,然后使用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进行输入。
答案 1 :(得分:6)
将它们放入列表中,然后在列表上运行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
答案 2 :(得分:2)
如果你想要同一个文件中的所有输出,这可能会有所帮助。
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
答案 3 :(得分:0)
这是使用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个数据集和其他函数。 我发现它是最灵活的解决方案。