2014-10-31 46 views
9

我已经广泛搜索,但没有在堆栈溢出中找到对此问题的答案。将列添加到R中的空白数据框中

可以说我有一个数据帧。

我定义:

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) 

回答

7

行尺寸是不固定的,但data.frames被存储为列表被限制为具有相同长度的矢量。您不能添加到col1因为acol1有三个值(行)和a具有零,从而打破了约束。当您尝试通过添加比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)

+0

我想这接近我一直在做了。我认为有一个比这更聪明的解决方案。我意识到我正在使用矢量,而不是将其添加到数据框中。另外,当我使用fixed这个词时,我可能没有描述我的意思。行尺寸不能像列尺寸那样容易地改变。 – Michal 2014-11-01 22:08:11

+0

此外,它是这样的答案:http://stackoverflow.com/questions/7962267/cbind-a-df-with-an-empty-df-cbind-fill – Michal 2014-11-01 22:32:26

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) 
    } 
} 
相关问题