Colwise ест имена столбцов в ddply

Я пытаюсь разделить фрейм данных, найти случаи, когда фреймы суб-данных не сбалансированы, и добавить 0 значений для определенных уровней фактора, которые отсутствуют. Чтобы сделать это, в ddply я сделал быстрое сравнение с вектором набора того, какие уровни фактора должны быть там, а затем создал несколько новых строк, реплицировал первую строку набора подданных, но изменил их значения, а затем связал их к старому набору данных.

Я использую colwise, чтобы сделать репликацию.

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

#a test data frame
g <- data.frame(a=letters[1:5], b=1:5)

#repeat rows using colwise
rep.row <- function(r, n){
  colwise(function(x) rep(x, n))(r)
}

#if I want to do this with just one row, I get all of the columns
rep.row(g[1,],5)

Это хорошо. Это печатает

  a b
1 a 1
2 a 1
3 a 1
4 a 1
5 a 1

#but, as soon as I use ddply to create some new data
#and try and smoosh it to the old data, I get errors
ddply(g, .(a), function(x) {

  newrows <- rep.row(x[1,],5)
  newrows$b<-0
  rbind(x, newrows)

})

Это дает

Error in rbind(deparse.level, ...) : 
  numbers of columns of arguments do not match

Вы можете увидеть проблему с этой отлаженной версией

#So, what is going on here?
ddply(g, .(a), function(x) {
  newrows <- rep.row(x[1,],5)
  newrows$b<-0
  print(x)
  print("\n\n")
  print(newrows)
  rbind(x, newrows)

})

Вы можете видеть, что x и newrows имеют разные столбцы - они отличаются в.

  a b
1 a 1
[1] "\n\n"
  b
1 0
2 0
3 0
4 0
5 0
Error in rbind(deparse.level, ...) : 
  numbers of columns of arguments do not match

Что здесь происходит? Почему, когда я использую colwise в кадре подданных, идентифицирующие строки съедаются?

1 ответ

Кажется, это забавное взаимодействие между ddply и colwise. Более конкретно, проблема возникает, когда colwise звонки strip_splits и находит vars атрибут, который был дан ddply,

В качестве обходного пути попробуйте поместить эту первую строку в вашу функцию,

   attr(x, "vars") <- NULL
   # your code follows
   newrows <- rep.row(x[1,],5)
Другие вопросы по тегам