2015-08-06 3 views
2

У меня есть вложенный именованный список, который выглядит следующим образом:Установить тип данных значений в функции расплава в г

> data <- list("1"=list(rating=-1,points=190,name="Fernando"),"2"=list(rating=3,points=532,name="Carlos")) 
> data 
$'1' 
$'1'$rating 
[1] -1 

$'1'$points 
[1] 190 

$'1'$name 
[1] "Fernando" 

$'2' 
$'2'$rating 
[1] 3 

$'2'$points 
[1] 532 

$'2'$name 
[1] "Carlos" 

Теперь, когда я использую расплав функции «данные», то он преобразует значение для имени вместо числового. И я могу понять, почему, поскольку тип данных для значения задан как числовой. Есть ли способ конвертировать тип данных для значения в общий характер.

Вот что я получаю, когда я использую функцию расплава:

> melt(data) 
    value L2  L1 
1 -1  rating 1 
2 190  points 1 
3  1  name  1 
4  3  rating 2 
5 532  points 2 
6  1  name  2 

Но то, что я хочу, это следующее:

 value L2  L1 
1 -1  rating 1 
2 190  points 1 
3 Fernando name  1 
4  3  rating 2 
5 532  points 2 
6 Carlos name  2 

, где тип данных значений символов.

+0

Кажется, что '' Fernando'' хранится как переменная 'factor'. В противном случае 'R' не может преобразовать его в число. – MichaelChirico

+0

Если '' Fernando'' хранится как символ, я думаю, что 'melt' преобразует все в' character'. – MichaelChirico

+4

Это страшные 'strAsAsFactors = TRUE'. «Некорректное» преобразование фактически происходит в 'rbind.fill', после того как каждый элемент списка одиночных элементов преобразуется в кадр данных в' melt.default', используя только обычный вызов 'data.frame()'. Если я запустил код с параметрами (stringsAsFactors = FALSE), вы получите то, что хотите. – joran

ответ

5

Вы можете использовать rapply, не уверен, что о вашем nestedness

melt(rapply(data, as.character, how="list")) 
#  value  L2 L1 
# 1  -1 rating 1 
# 2  190 points 1 
# 3 Fernando name 1 
# 4  3 rating 2 
# 5  532 points 2 
# 6 Carlos name 2 

Это рекурсивная версия apply, поэтому полезно для обхода вложенных списков.

2

Я думаю, что это должно работать; вложенный lapply для объекта data, а затем (после преобразования в as.character) использовать melt пакета reshape2.

melt(lapply(data, function(x) lapply(x, as.character))) 
    value  L2 L1 
1  -1 rating 1 
2  190 points 1 
3 Fernando name 1 
4  3 rating 2 
5  532 points 2 
6 Carlos name 2 

или просто в два этапа с data <- lapply(data, function(x) lapply(x, as.character)) и затем melt(data).