将列添加到R中的空数据框

时间:2014-10-31 22:04:03

标签: r list dataframe row

我已广泛搜索但未在Stack Overflow上找到这个问题的答案。

假设我有一个数据框a。

我定义:

a <- NULL
a <- as.data.frame(a)

如果我想在此数据框中添加一列:

a$col1 <- c(1,2,3)

我收到以下错误:

Error in `$<-.data.frame`(`*tmp*`, "a", value = c(1, 2, 3)) : 
    replacement has 3 rows, data has 0

为什么行尺寸固定但列不是?

如何更改数据框中的行数?

如果我这样做(首先将数据输入列表然后转换为df),它可以正常工作:

a <- NULL
a$col1 <- c(1,2,3)
a <- as.data.frame(a)

2 个答案:

答案 0 :(得分:9)

行维度不固定,但data.frames存储为受限制为具有相同长度的向量列表。您无法将col1添加到a,因为col1有三个值(行)且a为零,从而打破了约束。当您尝试通过添加比data.frame更长的列来扩展data.frame的维度时,R不会默认自动生成值。第二个示例有效的原因是col1是data.frame中唯一的向量,因此data.frame初始化为三行。

如果要自动展开data.frame,可以使用以下功能:

cbind.all <- function (...) 
{
    nm <- list(...)
    nm <- lapply(nm, as.matrix)
    n <- max(sapply(nm, nrow))
    do.call(cbind, lapply(nm, function(x) rbind(x, matrix(, n - 
        nrow(x), ncol(x)))))
}

这将使用NA填充缺失值。你可以使用它:cbind.all( df, a )

答案 1 :(得分:1)

你也可以做这样的事情,我从多个文件读取数据,抓住我想要的列,并将其存储在数据帧中。我检查数据帧中是否有任何内容,如果没有,请创建一个新数据而不是获得有关行数不匹配的错误:

readCounts = data.frame()

for(f in names(files)){
    d = read.table(files[f], header=T, as.is=T)
    d2 = round(data.frame(d$NumReads))
    colnames(d2) = f
    if(ncol(readCounts) == 0){
        readCounts = d2
        rownames(readCounts) = d$Name
    } else{
        readCounts = cbind(readCounts, d2)
    }
}