我在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)发布于 2014-11-01 08:14:18
行的维度不是固定的,但是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 )
发布于 2017-11-29 07:30:02
您也可以这样做,我从多个文件中读取数据,获取所需的列,并将其存储在数据帧中。我检查dataframe中是否有任何内容,如果没有,则创建一个新的,而不是得到关于不匹配的行数的错误:
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)
}
}https://stackoverflow.com/questions/26684072
复制相似问题