For循环不向R- [R 3.2.2,Win10 Pro,64-bit]中的数据帧添加行

时间:2016-06-29 13:11:01

标签: r

目标:使用列表循环向数据框添加行的过程,其中列表的每个元素包含2个数据帧的2个对象/元素。

代码:

  df <- data.frame(hospital = character(), state = character())
  finalList <- list(list("hospital1","state1"),list("hospital2","state2"))

  for(i in seq_len(length(finalList))){
       df[nrow(df)+1, ] <- as.vector(finalList[[i]])
  }
  df

输出

    Warning messages:
1: In `[<-.factor`(`*tmp*`, iseq, value = "a") :
  invalid factor level, NA generated
2: In `[<-.factor`(`*tmp*`, iseq, value = "b") :
  invalid factor level, NA generated
3: In `[<-.factor`(`*tmp*`, iseq, value = "c") :
  invalid factor level, NA generated
4: In `[<-.factor`(`*tmp*`, iseq, value = "d") :
  invalid factor level, NA generated
> df
  hospital state
1     <NA>  <NA>
2     <NA>  <NA>

为什么输出NA?我尝试在循环中使用print函数,它执行以下操作:

[[1]]
[1] "a"

[[2]]
[1] "b"

[[1]]
[1] "c"

[[2]]
[1] "d"

我是R.的新手。但是,我确实通过指定stringsAsFactors = F纠正了这个问题,并浏览了stringsAsFactors的文档,并搜索了各种因素。代码中究竟发生了什么并不是很清楚,我知道在stringsAsFactors期间read.csv用于读取字符串(TRUE值)或因子(FALSE值),但我是{在这里努力应用这种逻辑。

2 个答案:

答案 0 :(得分:2)

要获取最终的data.frame,您可以尝试使用第一个lapply将列表中的每个“prime”元素放入data.frame,并使用所需的列名称,然后将它们合并到{{1}行。 1}}:

rbind

答案 1 :(得分:1)

一个非常简单的解决方案使用plyr包,特别是ldply函数。

library(plyr)
finalList <- list(list("hospital1","state1"),list("hospital2","state2"))
# ldply will apply the unlist function to each element to finalList and 
# return a data.frame
hospital_df <- ldply(finalList, unlist)
names(hospital_df) <- c("hospital", "state")
hospital_df

如果您不熟悉plyr软件包,可以找到相当详细的介绍。