我已广泛搜索但未在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)
答案 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)
}
}