Сохраняйте имена строк при использовании rbind.fill в R

Кто-нибудь знает, как сохранить имена строк в функции rbind.fill.

library(plyr)

#creating data
a <- mtcars[ 1:5 , c("mpg","hp","gear") ]
b <- mtcars[ 6:10 , c("mpg","disp","gear") ]

#does not work because there are different colnames
rbind(a,b)

#works but eliminates the rownames
bound <- rbind.fill( a , b )

Я настраиваю цикл, в котором объекты будут связаны с помощью rbind.fill. Прямо сейчас я использую функцию объединения следующим образом:

namess <- c( rownames(a) , rownames(b) )
rownames(bound) <- namess

Я подумал, что может быть лучший способ. Спасибо!


person MatthewR    schedule 07.05.2013    source источник
comment
Я бы посчитал это ошибкой. Я не знаю, есть ли у plyr форум/место для сообщений об ошибках, но если есть, кто-то должен дать ссылку на него, и это должно быть отправлено imo.   -  person eddi    schedule 07.05.2013
comment
@eddi согласился :) я только что отправил его на github github.com/hadley/plyr/issues/ 156   -  person Anthony Damico    schedule 07.05.2013
comment
Plyr не поддерживает имена строк. Лучше поместить их в переменную, а затем работать с ними явно.   -  person hadley    schedule 07.05.2013
comment
@hadley, есть ли причина, по которой функции plyr, работающие с data.frame, не должны поддерживать имена строк? Это кажется естественным и тривиальным изменением для добавления к rbind.fill.   -  person eddi    schedule 07.05.2013
comment
@eddi Мое рассуждение выше: имена строк не добавляют ничего, что вы уже не можете сделать. Плюс не очевидно, как они работают с (например) ddply.   -  person hadley    schedule 07.05.2013
comment
@hadley - я согласен, что проблема не относится к ddply, но относится к rbind.fill. Тот факт, что другие функции в plyr не работают/не могут работать с data.frame именами строк, не означает, что и эта не должна этого делать.   -  person eddi    schedule 07.05.2013
comment
@eddi Я бы с радостью принял патч и тестовые случаи   -  person hadley    schedule 08.05.2013


Ответы (2)


Вы можете попробовать применить пользовательскую функцию, которая выполняет rbind.fill и автоматически устанавливает начальные имена строк следующим образом:

# List of sample data
ab.list <- list(a <- mtcars[1:5 , c("mpg","hp","gear")], 
                b <- mtcars[6:10 , c("mpg","disp","gear")])

# Apply custom function (rbind and rownames adjustment) to sample data
do.call(function(...) {

  tmp <- plyr::rbind.fill(...)
  rownames(tmp) <- sapply(ab.list, function(i) {
    rownames(i)
  })

  return(tmp)

}, ab.list)

                   mpg  hp gear  disp
Mazda RX4         21.0 110    4    NA
Mazda RX4 Wag     21.0 110    4    NA
Datsun 710        22.8  93    4    NA
Hornet 4 Drive    21.4 110    3    NA
Hornet Sportabout 18.7 175    3    NA
Valiant           18.1  NA    3 225.0
Duster 360        14.3  NA    3 360.0
Merc 240D         24.4  NA    4 146.7
Merc 230          22.8  NA    4 140.8
Merc 280          19.2  NA    4 167.6

Ознакомьтесь с предыдущим сообщением, посвященным аналогичная проблема.

person fdetsch    schedule 07.05.2013
comment
Вероятно, лучше сначала извлечь имена строк из функции, проанализировав аргументы в ..., чем обращаться к родительскому фрейму для них. - person joran; 07.05.2013
comment
На самом деле у меня возникли проблемы с тем, чтобы придумать элегантный способ обработки передачи ab.list и ab.list[[1]], ab.list[[2]] по отдельности. - person joran; 07.05.2013

Так как я разместил этот вопрос пять лет назад - стала доступна новая функция. smartbind решает эту проблему.

library( gtools) 

#creating data
a <- mtcars[ 1:5 , c("mpg","hp","gear") ]
b <- mtcars[ 6:10 , c("mpg","disp","gear") ]

smartbind( a , b )
person MatthewR    schedule 02.02.2018
comment
Ты уверен? smartbind также не сохраняет имена строк! - person Tomas; 15.10.2020
comment
@TMS - да, это было 2 года назад. я снял чек - person MatthewR; 15.10.2020