在R中向空数据框添加列

30

我进行了广泛的搜索,但在 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

为什么行维度是固定的,而列维度不是?

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

如果我首先将数据输入列表中,然后再转换为数据框,则可以正常工作:

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

12

行维度不是固定的,但数据框被存储为向量列表,这些向量被限制为具有相同的长度。您无法将col1添加到a中,因为col1有三个值(行),而a没有任何值,从而破坏了约束条件。R默认情况下不会在尝试通过添加比数据框更长的列来扩展数据框的维度时自动创建值。第二个示例有效的原因是col1是数据框中唯一的向量,因此数据框初始化为三行。

如果您想要自动扩展数据框,您可以使用以下函数:

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
我猜这已经接近我之前所做的了。我认为应该有比这更聪明的解决方案。我意识到我使用的是向量,而不是将其添加到数据框中。此外,当我使用“固定”一词时,我可能没有很好地描述我的意思。行维度不像列维度那样容易更改。 - Michal
另外,这个答案与此相同:https://dev59.com/lmsz5IYBdhLWcg3wWmUy - Michal

3
如果您有一个名为df的空数据框,我认为另一个相当简单的解决方案如下:
df[1,]=NA  # ad a temporary new row of NA values
df[,'new_column'] = NA # adding new column, called for example 'new_column'
df = df[0,] # delete row with NAs

希望这能有所帮助。


2
您也可以像这样做,从多个文件中读取数据,获取所需的列并将其存储在数据框中。我会检查数据框中是否有任何内容,如果没有,则创建一个新的数据框,而不是出现行数不匹配的错误:
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)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接