【问题标题】:Same function over multiple data frames in RR中多个数据帧的相同功能
【发布时间】: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)

但我想在所有数据帧上运行它。

【问题讨论】:

标签: r for-loop dataframe lapply


【解决方案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 输入。

      【讨论】:

        猜你喜欢
        • 2021-12-25
        • 2021-12-11
        • 2020-07-11
        • 2020-03-23
        • 2016-07-24
        • 1970-01-01
        • 1970-01-01
        • 2020-11-14
        • 1970-01-01
        相关资源
        最近更新 更多