我已经在这里回顾了其他类似的主题,但尚未找到我的问题的答案。我在for循环中构建一个列表,我希望将其转换为数据框。最终列表如下所示:
[[1]]
[1] 117
[[2]]
[1] 1041
[[3]]
[1] 243
[[4]]
[1] 474
[[5]]
[1] 402
我想将其转换为具有特定列名称的数据框:ID和nobs。例如,对于数据框中的第5行,ID的行值为5,bobs的值为402.运行此代码:
d <- data.frame(cbind(l))
给了我列但没有名字。如何以及在何处指定列名?我正在学习R.感谢您的帮助。
这是我的功能的完整代码:
complete <- function(directory, id) {
files_full <- list.files(directory, full.names = TRUE)
l <- list()
for (i in id){
nobs <- sum(complete.cases(read.csv(files_full[i])))
l[i] <- nobs
}
d <- data.frame(cbind(l))
d
}
答案 0 :(得分:3)
你可以试试这个:
l <- list(a=305,b=354,c=436,d=36)
> l
$a
[1] 305
$b
[1] 354
$c
[1] 436
$d
[1] 36
data.frame(id=names(l), nobs=unlist(l))
id nobs
a a 305
b b 354
c c 436
d d 36
data.frame(l)
a b c d
1 305 354 436 36
unlist(l)
a b c d
305 354 436 36
请注意,第一个和第二个是data.frame,但是last是名为numeric vector。
编辑:
您的列表中可能没有您的示例中的任何名称。 我假设您要创建命名列表并将其转换为data.frame ... 如果要将名称设置为列表,则应该起作用:
complete <- function(directory, id) {
files_full <- list.files(directory, full.names = TRUE)
l <- vector(mode='list', length=length(files_full))
for (i in files_full){
nobs <- sum(complete.cases(read.csv(i)))
l[i] <- nobs
}
d <- data.frame(cbind(l))
d
}
但我们试试这个:
sapply(list.files(), function(x)sum(complete.cases(read.csv(x))))
它应该返回类似的内容:
a.csv b.csv c.csv
2153 326 235