如何在R中使用标题向空数据框添加行?

时间:2012-09-27 05:02:43

标签: r row dataframe add

  

可能重复:
  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

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

6 个答案:

答案 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选项

你可以使用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)

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

  1. 将实际数据框转换为矩阵 as.matrix(compData)
  2. 将新行添加到结尾 rbind(as.matrix(compData), c(5,443))
  3. 将矩阵转换回数据框 as.data.frame(rbind(as.matrix(compData), c(5,443)))
  4. 简而言之:
    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