将输出从lapply提取到数据帧

rob*_*ntw 18 r list dataframe

我有一些R代码,它使用以下代码对当前目录中的所有文件执行一些数据提取操作:

files <- list.files(".", pattern="*.tts")
results <- lapply(files, data_for_time, "17/06/2006 12:00:00")
Run Code Online (Sandbox Code Playgroud)

来自lapply的输出如下(使用提取dput()) - 基本上是一个完整的向量列表:

list(c("amer", "14.5"), c("appl", "14.2"), c("brec", "13.1"), 
c("camb", "13.5"), c("camo", "30.1"), c("cari", "13.8"), 
c("chio", "21.1"), c("dung", "9.4"), c("east", "11.8"), c("exmo", 
"12.1"), c("farb", "14.7"), c("hard", "15.6"), c("herm", 
"24.3"), c("hero", "13.3"), c("hert", "11.8"), c("hung", 
"26"), c("lizr", "14"), c("maid", "30.4"), c("mart", "8.8"
), c("newb", "14.7"), c("newl", "14.3"), c("oxfr", "13.9"
), c("padt", "10.3"), c("pbil", "13.6"), c("pmtg", "11.1"
), c("pmth", "11.7"), c("pool", "14.6"), c("prae", "11.9"
), c("ral2", "12.2"), c("sano", "15.3"), c("scil", "36.2"
), c("sham", "12.9"), c("stra", "30.9"), c("stro", "14.7"
), c("taut", "13.7"), c("tedd", "22.3"), c("wari", "12.7"
), c("weiw", "13.6"), c("weyb", "8.4"))
Run Code Online (Sandbox Code Playgroud)

不过,我想,然后处理这个输出作为一个数据帧有两个列:一个用于字母代码("amer","appl"等等),一个用于数字(14.5,14.2等).

不幸的是,as.data.frame似乎没有使用列表中嵌套向量的输入.我该如何转换呢?我是否需要更改函数data_for_time返回其值的方式?目前它刚刚回归c(name, value).或者有一种很好的方法可以将这种输出转换为数据帧吗?

fot*_*ton 40

如果results是你的清单,试试这个:

> as.data.frame(do.call(rbind, results))

     V1   V2
1  amer 14.5
2  appl 14.2
3  brec 13.1
4  camb 13.5
...
Run Code Online (Sandbox Code Playgroud)

  • +1 - `do.call`在这里很优雅.我甚至建议OP修改他的`data_for_time`函数以返回具有适当名称和类型的data.frame.为了删除这里的`as.data.frame`调用以及强制的风险. (5认同)

jor*_*ran 11

一个选项可能是使用plyr包中的ldply函数,它将把东西缝合回数据框.

它的一个简单例子:

ldply(1:10,.fun = function(x){c(runif(1),"a")})
                    V1 V2
1    0.406373084755614  a
2    0.456838687881827  a
3    0.681300171650946  a
4    0.294320539338514  a
5    0.811559669673443  a
6    0.340881009353325  a
7    0.134072444401681  a
8  0.00850683846510947  a
9    0.326008745934814  a
10    0.90791508089751  a
Run Code Online (Sandbox Code Playgroud)

但请注意,如果你将变量类型混合使用c(),你可能想要改变你的函数data.frame(name= name,value = value)而不是简单地返回c(name,value).否则一切都将被强制转换为角色(正如我上面的例子).