【问题标题】:Looping through list of data frames in R循环遍历R中的数据帧列表
【发布时间】:2013-10-18 22:40:04
【问题描述】:

我有一系列数据框,df1df2,其中每个数据框都遵循这样的结构:

x <- c(1:5)
y <- c(1:5)
df1 <- data.frame("Row One"=x, "Row Two"=y)

df1 的示例输出:

 Row.One    Row.Two
    1           1
    2           2
    3           3
    4           4
    5           5

我把每个数据框都放到一个列表里dfList &lt;- list(df1,df2...)

现在我想循环遍历此列表中的每个数据框对象,以使用此命令替换列名:

a <- grep("One", colnames(df))
b <- grep("Two", colnames(df))

names(df)[a] <- "R1"
names(df)[b] <- "R2"

如何在 R 中构造一个循环,以便无论列表对象中有多少数据框,上面的列名更改命令都将应用于每个数据框?

【问题讨论】:

    标签: r


    【解决方案1】:
    > df1 <- data.frame("Row One"=x, "Row Two"=y)
    > df2 <- data.frame("Row Two"=y,"Row One"=x)
    > dfList <- list(df1,df2)
    > lapply(dfList, function(x) {
                        names(x)[ grep("One", names(x))] <- "R1"
                        names(x)[ grep("Two", names(x))] <- "R2"
                        x} )
    [[1]]
      R1 R2
    1  1  1
    2  2  2
    3  3  3
    4  4  4
    5  5  5
    
    [[2]]
      R2 R1
    1  1  1
    2  2  2
    3  3  3
    4  4  4
    5  5  5
    

    【讨论】:

    • 这很好用,但是当我打电话给dflist[[1]] 时,它仍然显示“Row One”而不是“R1”。为什么当我运行lapply 命令时更改只出现在控制台上,但不更新数据框本身?我做错了吗?
    • 如果您不将结果分配给命名对象,它就会“消失”。如果您希望它替换 dfList,您需要使用 dfList &lt;-
    【解决方案2】:

    只用length(dfList)?

    for(i in 1:length(dfList))
    {
        a <- grep("One", names(dfList[[i]]))
        ... #etc.
    }
    

    使用lapply会更快。

    ChangeNames = function(Data)
    {
        a = grep("One", names(Data))
        b = grep("Two", names(Data))
        names(Data)[c(a,b)] <- c("R1", "R2")
        return(Data)
    }
    lapply(dfList, ChangeNames) #Returns list of renamed data frames.
    

    【讨论】:

    • 如果“a”为空,这是否也有效?似乎它将“R1”分配给“b”。
    • 不,它没有。 OP 只是希望将该命令应用于列表中的每个数据帧。
    • 好的。我习惯于将 grep 视为有条件的事物(“如果我找到 expr...”),但是,是的,OP 似乎知道每个都会有一个匹配项。
    • 是的,如果没有匹配,grep 将返回integer(0),因此如果a 找不到匹配,c(a,b) 将与b 相同。
    【解决方案3】:

    或者像这样使用llply(来自plyr)或lapply

    library(plyr)
    result_list <- llply(list_of_df, function(x) {
                    # do the replacing
                    return(x)
                    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 2017-12-14
      • 2021-12-25
      • 1970-01-01
      • 2021-06-25
      • 2021-02-08
      相关资源
      最近更新 更多