可能重复:
R: losing column names when adding rows to an empty data frame
我创建了一个空数据框,其列名仅如下
> compData <- data.frame(A= numeric(0), B= numeric(0))
> compData
[1] A B
<0 rows> (or 0-length row.names)
> compData <- rbind(compData,c(5,443))
> compData
X5 X443
1 5 443
在上面添加一行后,列名称被更改。如何将新行数据添加到数据框?
答案 0 :(得分:26)
添加到零行data.frame
将采取不同的方式添加到已包含行的data.frame
来自?rbind
rbind数据帧方法首先删除所有零列和零行参数。 (如果没有,则返回带有列的第一个参数,否则为零列零行数据帧。)然后从第一个数据帧中获取列的类,并按名称(而不是按位置)匹配列。因子必须根据需要扩大其水平(按所遇因素的水平集的水平顺序),当且仅当所有组分都是有序因子时,结果才是有序因子。 (最后一点与S-PLUS不同。)旧式类别(具有级别的整数向量)被提升为因子。
您有多种选择 -
compData[1, ] <- c(5, 443)
或者您可以将c(5,433)
强制转换为列表或data.frame
rbind(compData,setNames(as.list(c(5,443)), names(compData)))
或
rbind(compData,do.call(data.frame,setNames(as.list(c(5,443)), names(compData))))
但在这种情况下你也可以这样做
do.call(data.frame,setNames(as.list(c(5,443)), names(compData)))
你可以使用data.table
函数rbindlist
来减少检查,从而保留第一个数据的名称。框架
library(data.table)
rbindlist(list(compData, as.list(c(5,443))
答案 1 :(得分:15)
我只是有一个更简单的方法来做到这一点......如下
compData <- data.frame(A= numeric(0), B= numeric(0))
compData
compData[nrow(compData)+1, ] <- c(5, 443)
compData
答案 2 :(得分:5)
Colnames <- names(compData)
compData <- rbind(compData, c(5, 443))
names(compData) <- Colnames
答案 3 :(得分:3)
您可以按索引分配到数据框:
compData <- data.frame(A= numeric(0), B= numeric(0))
compData
compData[1, ] <- c(5, 443)
compData
给出了:
> compData <- data.frame(A= numeric(0), B= numeric(0))
> compData
[1] A B
<0 rows> (or 0-length row.names)
> compData[1, ] <- c(5, 443)
> compData
A B
1 5 443
答案 4 :(得分:2)
如果您有相同类型的数据*,则可以执行以下操作:
as.matrix(compData)
rbind(as.matrix(compData), c(5,443))
as.data.frame(rbind(as.matrix(compData), c(5,443)))
简而言之:
compData <- as.data.frame(rbind(as.matrix(compData), c(5,443)))
*如果您有相同类型的数据,您可能希望将它们保存在矩阵中。
答案 5 :(得分:2)
您可以将函数structure
与.Names
参数一起使用:
compData <- structure(rbind(compData,c(5,443)), .Names = names(compData))
# A B
#1 5 443