【问题标题】:Reshape a list of dataframes using columns index使用列索引重塑数据框列表
【发布时间】:2013-12-31 15:10:40
【问题描述】:

我有一个包含几个数据框的列表,每个数据框有 3 列,我想全部重塑它们。每个数据框都有不同的列名(我试图更改所有 df 的列名但没有成功,但这是另一个 SO 问题:)),所以我必须索引列而不是使用列名。

我可以使用 lapply 得到我想要的:

df = lapply(df, function(x) reshape(x, v.names = 1, idvar = 3, timevar = 2, direction ="wide"))

其中 1,2 和 3 是我要使用的 df 列。但出于好奇,我尝试使用 for 循环来做同样的事情,但我做错了。

for (i in length(df)){
df[[i]] <- reshape(df[[i]], v.names = 1, idvar = 3, timevar = 2, direction = "wide")
}

这没有任何作用。鉴于我不能使用列名,我不确定如何指定列。例如:

for (i in length(df)){
df[[i]] <- reshape(df[[i]], v.names = df[[i]][,1], idvar = df[[i]][,3], timevar = df[[i]][,2], direction = "wide")
}

Error in `[.data.frame`(data, , idvar) : undefined columns selected

那么,如何使用列索引通过 for 循环重塑数据框列表?有什么想法吗?

谢谢。

【问题讨论】:

    标签: r reshape


    【解决方案1】:

    问题出在你的代码中

    for (i in length(df))
    

    这只会通过一次 i = 列表的最后一个成员。试着把length(df) 放到控制台上——它只输出一个数字。你想要一个数字 1、2、...、长度(df)的向量,所以你想要1:length(df)

    for (i in 1:length(df))
    

    另一个选项(如@*boat 所述)是seq_along(df)。这更安全 - 如果未定义 df,它将产生空向量,这与上面的方法不同。但我更喜欢上面的符号,这只是上下文和个人喜好的问题。

    【讨论】:

    • for (i in seq_along(df)) 更安全,因为您提供的选项在长度为 0 的情况下失败。
    • 谢谢,我忘记了——这是上面的一个更安全的变体。
    • 对,这是有道理的。谢谢你们。
    【解决方案2】:

    我将尝试解决这两个问题(重塑和更改 df 列表的名称)。

    data(Indometh)
    names(Indometh)
    ## [1] "Subject" "time"    "conc"
    
    ### create a list of df
    dflist <- lapply(1:3, function(x) Indometh)
    
    ### changing the name of df
    dflist <- lapply(dflist, setNames,
                     c("subject", "timevar", "conc"))
    
    ### Reshaping the data using colnames
    dflist <- lapply(dflist, function(df)
                     reshape(df,
                             v.names = "conc",
                             idvar = "subject",
                             timevar = "timevar",
                             direction = "wide")
                     )
    
    str(dflist, max.level = 1)
    ## List of 3
    ##  $ :Classes ‘nfnGroupedData’, ‘nfGroupedData’, ‘groupedData’ and 'data.frame':   6 obs. of  12 variables:
    ##   ..- attr(*, "reshapeWide")=List of 5
    ##  $ :Classes ‘nfnGroupedData’, ‘nfGroupedData’, ‘groupedData’ and 'data.frame':   6 obs. of  12 variables:
    ##   ..- attr(*, "reshapeWide")=List of 5
    ##  $ :Classes ‘nfnGroupedData’, ‘nfGroupedData’, ‘groupedData’ and 'data.frame':   6 obs. of  12 variables:
    ##   ..- attr(*, "reshapeWide")=List of 5
    

    【讨论】:

      猜你喜欢
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      • 2017-11-05
      相关资源
      最近更新 更多