【问题标题】:Loop over list to assign names in R not working循环列表以在 R 中分配名称不起作用
【发布时间】:2021-01-14 04:05:54
【问题描述】:

我有一堆行要添加到一个更大的数据框中,称为更大的_false。我想使用 for 循环来做到这一点。 每行如下所示:

new_row1 <- c(402, 1, "false alarm", 0)

我想为较大数据框的列的每个新行分配名称,因此我循环遍历列表中的每一行并为每个行分配相同的名称。

rowlist = list(new_row1, new_row2, new_row3, new_row4, new_row5, new_row6, new_row1011, new_row1014, new_row1016, new_row1022, new_row1023, new_row2021, new_row3046)

for (item in rowlist) {
      names(item) <- c("guest_id", "sessionNum", "interactions.hitType", "n")
    }

然后我循环遍历每个并将它们添加到已经有这些列名的大数据框中。

for (item in rowlist) {
      bigger_false <- rbind(bigger_false, item)
    }

现在,第一个循环似乎适用于第一行(它成功地分配了名称)。所以如果我手动做

bigger_false <- rbind(bigger_false, new_row1)

我没有错误。但是,第一个循环的其余部分没有成功地为其余的行分配名称,因此 rbind 循环在第一次迭代后给出错误:“Argument 2 must have names”。

为什么会这样?提前致谢。

【问题讨论】:

  • 我不认为这完全是重复的,但是像this one 这样的几个 SO 帖子应该有助于如何从循环中分配回值。完整的reproducible example 可以更轻松地帮助/指向以前的 SO 帖子

标签: r list loops names


【解决方案1】:

item 变量循环遍历行列表,但不修改行列表的内容。
试试:

new_row1 <- c(402, 1, "false alarm", 0)
new_row2 <- c(403, 2, "false alarm", 0)

rowlist = list(new_row1, new_row2)

for (item in 1:length(rowlist)) {
  names(rowlist[[item]]) <- c("guest_id", "sessionNum", "interactions.hitType", "n")
}

bigger_false <- NULL
for (item in rowlist) {
  bigger_false <- rbind( item, bigger_false)
}
bigger_false

     guest_id sessionNum interactions.hitType n  
item "403"    "2"        "false alarm"        "0"
item "402"    "1"        "false alarm"        "0"

【讨论】:

    【解决方案2】:

    除了循环,你还可以这样做:

    # creates a matrix
    df <- do.call(rbind, rowlist)
    
    # create a dataframe
    df <- data.frame(df)
    colnames(df) <- c("guest_id", "sessionNum", "interactions.hitType", "n")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 2020-12-12
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多