неразделенный список, факторы слияния - PullRequest
4 голосов
/ 29 апреля 2011

У меня есть следующий фрейм данных в R:

  c1 c2  
1 10  a  
2 20  a  
3 30  b  
4 40  b

Я тогда split это следующим образом: z = lapply(split(test$c1, test$c2), function(x) {cut(x,2)}) .z - это тогда:

$a  
[1] (9.99,15] (15,20]  
Levels: (9.99,15] (15,20]

$b  
[1] (30,35] (35,40]
Levels: (30,35] (35,40]  

Я бы хотел затем объединить факторы обратно, разделив список unsplit(z, test$c2).Это генерирует предупреждение:

[1] (9.99,15] (15,20]   <NA>      <NA>     
Levels: (9.99,15] (15,20]
Warning message:
In `[<-.factor`(`*tmp*`, i, value = 1:2) :
  invalid factor level, NAs generated

Я хотел бы взять объединение всех уровней фактора и затем снять его, чтобы эта ошибка не произошла:

z$a = factor(z$a, levels=c(levels(z$a), levels(z$b)))
unsplit(z, test$c2)
[1] (9.99,15] (15,20]   (30,35]   (35,40]  
Levels: (9.99,15] (15,20] (30,35] (35,40]    

В моих реальных данныхкадр У меня очень большой список, поэтому мне нужно перебрать все элементы списка (а не только два).Каков наилучший способ сделать это?

Ответы [ 2 ]

4 голосов
/ 29 апреля 2011

Если я правильно понял ваш вопрос, я думаю, вы делаете это немного сложнее, чем нужно. Вот одно решение, использующее plyr. Сгруппируем по переменной c2:

require(plyr)
ddply(test, "c2", transform, newvar = cut(c1, 2))

, который возвращает:

  c1 c2    newvar
1 10  a (9.99,15]
2 20  a   (15,20]
3 30  b   (30,35]
4 40  b   (35,40]

и имеет структуру:

'data.frame':   4 obs. of  3 variables:
 $ c1    : num  10 20 30 40
 $ c2    : Factor w/ 2 levels "a","b": 1 1 2 2
 $ newvar: Factor w/ 4 levels "(9.99,15]","(15,20]",..: 1 2 3 4
4 голосов
/ 29 апреля 2011

Можете ли вы не просто unlist() z вместо этого?

> unlist(z)
       a1        a2        b1        b2 
(9.99,15]   (15,20]   (30,35]   (35,40] 
Levels: (9.99,15] (15,20] (30,35] (35,40]

или без имен на результирующий фактор:

> unlist(z, use.names=FALSE)
[1] (9.99,15] (15,20]   (30,35]   (35,40]  
Levels: (9.99,15] (15,20] (30,35] (35,40]

Вы можете объединить все вместе в простойодин вкладыш, который не требует дополнительных пакетов:

> (test2 <- within(test, newvar <- unlist(lapply(split(c1, c2), cut, 2))))
  c1 c2    newvar
1 10  a (9.99,15]
2 20  a   (15,20]
3 30  b   (30,35]
4 40  b   (35,40]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...