[英]Same function over multiple data frames in R - not over a list of data frames
[英]Same function over multiple data frames in R
我是 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)
但我想在所有數據幀上運行它。
制作一個數據框列表,然后使用 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。
將它們放入一個列表中,然后在列表上運行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
如果您希望所有輸出都在同一個文件中,這可能會有所幫助。
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
這是使用 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 個數據集和其他功能。 我發現它是最靈活的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.