为什么lapply()将我的R数据帧转换为列表?

时间:2018-10-11 20:27:39

标签: r

我正在使用lapply()修改R中的数据框,并发现当我不使用方括号分配数据框时,我的数据框已转换为列表对象。

例如,以下内容返回列表

junk <- data.frame(col1 = 1:3,
                   col2 = c("a,b,c"),
                   col3 = c(T,T,F))

junk <- lapply(junk, function(x) {
    if (is.numeric(x)) return(x*2)
    else return(x)})

str(junk)

其中以下内容返回一个数据帧。

junk <- data.frame(col1 = 1:3,
                   col2 = c("a,b,c"),
                   col3 = c(T,T,F))

junk[] <- lapply(junk, function(x) {
    if (is.numeric(x)) return(x*2)
    else return(x)})

str(junk)

我想知道为什么[]保留数据帧结构,以及[]在这种情况下正在做什么。我理解为什么第一个代码块将junk转换为列表,但是不明白为什么第二个代码块保留结构,尽管我想不出清楚的标题来描述问题/情况。谢谢。

1 个答案:

答案 0 :(得分:2)

lapply返回列表是很自然的,因为并不总是保证函数FUN返回相同大小的处理结果。

dat <- data.frame(a = c(1,1,2), b = c(1,1,1))
lapply(dat, unique)

第二个不能通过修改原始数据帧来保留结构。它做到了

tmp <- lapply(...); junk[] <- tmp; rm(tmp)