46

可能重复:
R:向空数据框添加行时丢失列名

我创建了一个只有列名的空数据框,如下所示

> 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

在上面添加一行后,列名被更改。如何将新行数据添加到数据框?

4

6 回答 6

34

添加到零行与添加到已经包含行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 选项

您可以使用检查较少的data.table函数rbindlist,从而保留第一个 data.frame 的名称

library(data.table)
rbindlist(list(compData, as.list(c(5,443))
于 2012-09-27T06:47:48.927 回答
23

我只是有一个更简单的方法来做到这一点......如下

compData <- data.frame(A= numeric(0), B= numeric(0))
compData
compData[nrow(compData)+1, ] <- c(5, 443)
compData
于 2012-09-27T05:55:35.613 回答
7
Colnames <- names(compData)
compData <- rbind(compData, c(5, 443))
names(compData) <- Colnames
于 2012-09-27T05:33:29.557 回答
4

您可以按索引分配给数据框:

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
于 2012-09-27T05:22:50.010 回答
4

您可以使用structure带有.Names参数的函数:

compData <- structure(rbind(compData,c(5,443)), .Names = names(compData))

#  A   B
#1 5 443
于 2012-09-27T13:13:12.090 回答
2

如果您有相同类型的数据*,您可以执行以下操作:

  1. 将实际数据框转换为矩阵。
    as.matrix(compData)
  2. 将新行添加到末尾。
    rbind(as.matrix(compData), c(5,443))
  3. 将矩阵转换回数据框。
    as.data.frame(rbind(as.matrix(compData), c(5,443)))

简而言之:
compData <- as.data.frame(rbind(as.matrix(compData), c(5,443)))

*如果您有相同类型的数据,您可能希望将它们保存在矩阵中。

于 2012-09-27T05:46:58.943 回答