R: Как сохранить имена строк с помощью rbind в таблице данных

Я теряю имена строк данных. Это происходит, когда функция 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
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)
1 1 2 1 test
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)
2 2 4 8 test
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)
3 3 6 27 test
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)
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

Как следует изменить код, чтобы сохранить имена строк?


person Community    schedule 02.01.2015    source источник
comment
В ответ на комментарий, который был удален. Использование data.table(pts, keep.rownames=TRUE) действительно исправляет вопрос, изначально опубликованный в примере кода. Но это не устраняет проблему в реальном коде. Я обновлю образец.   -  person    schedule 02.01.2015
comment
data.table объект не имеет row.names периода. Если вы хотите сохранить их, воспользуйтесь предложением, упомянутым в комментариях. См. этот вопрос   -  person David Arenburg    schedule 02.01.2015
comment
Я бы создал новый столбец с именем Test и сохранил имена строк в этой переменной.   -  person talat    schedule 02.01.2015
comment
Кроме того, ваш пример реален? Здесь действительно нет необходимости в двойных циклах и растущих объектах. Вы можете сделать все это примерно за одну/две строки векторизации.   -  person David Arenburg    schedule 02.01.2015
comment
Хорошо, это информативно. Я перенесу информацию об именах строк в столбцы, чтобы отслеживать их для дальнейшего использования. Будем считать этот вопрос закрытым. Я могу задать другой вопрос, связанный с маркировкой точек кластера, поскольку они помечаются как целые значения, и я предположил, что метки исходят из имен строк, которые, похоже, теряются при обработке.   -  person    schedule 02.01.2015
comment
Спасибо за комментарий относительно векторных линий/петлей. Внешняя петля похожа на вывешенную, но внутренняя петля искусственная. Внутренние данные генерируются с помощью ряда функций, использующих векторные линии. Внешний цикл выполняется небольшое количество раз (пока в разработке), поэтому генерация данных выполняется довольно быстро (пока). Позволяет ли использование одной векторизованной линии избежать роста объектов? Или, еще лучше, есть ли способ запрограммировать, чтобы избежать растущих объектов.   -  person    schedule 02.01.2015
comment
Хорошо, ответ добавлен....   -  person    schedule 02.01.2015


Ответы (1)


На основании информации в комментариях и приведенной ниже ссылке таблицы данных не хранят имена строк, поэтому имена строк не следует использовать с таблицами данных. Если имя строки содержит необходимую идентифицирующую информацию, эту информацию следует переместить в дополнительный столбец (столбцы) в таблице данных.

Ссылка на страницу 7 пакета 'data.table', редакция, декабрь 22 сентября 2014 г., цитата

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, а текст был переформатирован, чтобы уместиться здесь по горизонтали.

person Community    schedule 02.01.2015