目标:使用列表循环向数据框添加行的过程,其中列表的每个元素包含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值),但我是{在这里努力应用这种逻辑。
答案 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
软件包,可以找到相当详细的介绍。