【问题标题】:R create a vector with loop structureR创建一个具有循环结构的向量
【发布时间】:2011-11-19 21:36:58
【问题描述】:

我有一个列表listDFs,其中每个元素都是一个数据框。每个数据框都有不同的行数和相同的列数。

我应该创建一个从 listDFs[[i]]$Name 开始的向量,从列表中提取所有 i 元素。

我想使用这样的循环:

vComposti <- c()
for(j in 1:10){vComposti <- c(listDFs[[j]]$Name)}

但结果是一个仅包含列表的第一级 (listDFs[[1]]$Name) 的向量。

我哪里错了??你有什么建议吗??

【问题讨论】:

    标签: r


    【解决方案1】:

    你的问题出在这一行:

    vComposti <- c(listDFs[[j]]$Name)
    

    每次循环时,您都重新分配一个新值给vComposti覆盖之前的值。

    一般来说,最好预先分配向量并逐个元素地填充它:

    vComposti <- rep(NA, 10)
    for(j in 1:10){
        vComposti[j] <- c(listDFs[[j]]$Name)
    }
    

    但我也不清楚您期望的结果是什么。您创建了一个向量,但看起来您正试图在向量的每个元素中存储整个数据框列。如果是这种情况,您实际上可能正在寻找一个列表的结果:

    vComposti <- vector("list",10)
    for(j in 1:10){
        vComposti[[j]] <- c(listDFs[[j]]$Name)
    }
    

    另一个更复杂的选项可能是使用lapply

    lapply(listDFs,FUN = "[","Name")
    

    【讨论】:

    • 是的,lapply 是最好的选择,但是lapply 的返回是一个列表。我应该如何在数据框中转换它?
    • @Riccardo,因为data.frame 一个列表,你可以简单地在lapply的结果上使用as.data.frame
    • 我试过了,但是 R 控制台给出了这个错误: Data.frame(list(Name = c("A",: arguments imply different number of rows: 61, 57, 58、56、55、53、54、51、52、48.
    • 我用这个解决了最后一个问题:df &lt;-data.frame(matrix(unlist(lComposti),byrow=T))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 2020-01-27
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多