【问题标题】:R: How to keep row names with rbind on a data tableR:如何在数据表上使用 rbind 保留行名
【发布时间】:2015-01-02 13:15:27
【问题描述】:

我丢失了数据的行名。在数据表上使用 rbind 函数时似乎会发生这种情况。

这是一个显示应该发生什么的示例

library(data.table)
allData <- NULL
for (itest in seq(3)) {
  pts <- NULL
  npts <- 4
  for (ipt in seq(npts)) {
    pp <- c(ipt, ipt*2, ipt^3)
    pts <- rbind(pts,pp)
  }
  colnames(pts)<-c('A','B','C')
  rownames(pts) <- paste('test',itest,seq(npts),sep='_')
  # pts<-data.table(pts)
  print(pts)
  allData <- rbind(allData,pts)
}
print(allData)

输出是

         A B  C
test_1_1 1 2  1
test_1_2 2 4  8
test_1_3 3 6 27
test_1_4 4 8 64
test_2_1 1 2  1
test_2_2 2 4  8
test_2_3 3 6 27
test_2_4 4 8 64
test_3_1 1 2  1
test_3_2 2 4  8
test_3_3 3 6 27
test_3_4 4 8 64

使用数据表时,行名丢失

library(data.table)
allData <- NULL
for (itest in seq(3)) {
  pts <- NULL
  npts <- 4
  for (ipt in seq(npts)) {
    pp <- c(ipt, ipt*2, ipt^3)
    pts <- rbind(pts,pp)
  }
  colnames(pts)<-c('A','B','C')
  pts<-data.table(pts)
  rownames(pts) <- paste('test',itest,seq(npts),sep='_')
  allData <- rbind(allData,pts)
}
print(allData)

数据表输出

    A B  C
 1: 1 2  1
 2: 2 4  8
 3: 3 6 27
 4: 4 8 64
 5: 1 2  1
 6: 2 4  8
 7: 3 6 27
 8: 4 8 64
 9: 1 2  1
10: 2 4  8
11: 3 6 27
12: 4 8 64

如何修改代码以保留行名?

【问题讨论】:

  • 回应被删除的评论。使用 data.table(pts, keep.rownames=TRUE) 确实可以解决示例代码中最初发布的问题。但是,这并不能解决实际代码中的问题。我会更新示例。
  • data.table 对象没有row.names 句点。如果您想保留它们,请使用 cmets 中提到的建议。见this question
  • 我将创建一个名为 Test 的新列并将行名称存储在该变量中。
  • 另外,你的例子是真实的吗?这里确实不需要双循环和增长的对象。你可以用大约一/两条矢量化线来完成这一切
  • 好的,这很有意义。我将把“行名”信息移到列中,以备日后使用。让我们认为这个问题已经结束。我可能会问一个与标记聚类点有关的不同问题,因为它们被标记为整数值,并且我假设标签来自行名,这似乎在处理过程中丢失了。

标签: r data.table rbind rowname


【解决方案1】:

根据 cmets 中的信息和下面的 ref,数据表不存储行名,因此行名不应与数据表一起使用。如果行名包含所需的识别信息,则应将该信息移至数据表中的其他列中。

参考Package ‘data.table’, revision December 22, 2014的第7页,引用

A data.table is a list of vectors, just like a data.frame. However :
1. it never has rownames. Instead it may have one key of one or more columns. 
This key can be used for row indexing instead of rownames.

其中“it”指的是一个 data.table 对象,文本被重新格式化以适应此处的水平空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2020-01-25
    • 2013-05-01
    • 1970-01-01
    • 2014-12-05
    • 2016-11-12
    • 1970-01-01
    相关资源
    最近更新 更多