2017-01-26 4 views
6

Я использую аргумент patterns() в data.table::melt(), чтобы расплавить данные, содержащие столбцы с несколькими легко определенными шаблонами. Он работает, но я не вижу, как я могу создать переменную индекса символа вместо численного разбиения по умолчанию.Преобразование числового представления столбца «переменная» в исходную строку после расплавления с использованием шаблонов

Например, в А собака и кошка столбцы нумеруются ... посмотрим на столбец «переменной»:

A = data.table(idcol = c(1:5), 
      dog_1 = c(1:5), cat_1 = c(101:105), 
      dog_2 = c(6:10), cat_2 = c(106:110), 
      dog_3 = c(11:15), cat_3 = c(111:115)) 
head(melt(A, measure = patterns("^dog", "^cat"), value.name = c("dog", "cat"))) 

    idcol variable dog cat 
1:  1  1 1 101 
2:  2  1 2 102 
3:  3  1 3 103 
4:  4  1 4 104 
5:  5  1 5 105 
6:  1  2 6 106 

Однако в B колонки для собак и кошек пронумерованы с текстом , но столбец «переменная» по-прежнему является числовым.

B = data.table(idcol = c(1:5), 
       dog_one = c(1:5),  cat_one = c(101:105), 
       dog_two = c(6:10), cat_two = c(106:110), 
       dog_three = c(11:15), cat_three = c(111:115)) 
head(melt(B, measure = patterns("^dog", "^cat"), value.name = c("dog", "cat"))) 

    idcol variable dog cat 
1:  1  1 1 101 
2:  2  1 2 102 
3:  3  1 3 103 
4:  4  1 4 104 
5:  5  1 5 105 
6:  1  2 6 106 

Как заполнить столбец «переменная» одним/двумя/тремя вместо 1/2/3?

ответ

7

Там может быть более простым способом, но это похоже на работу:

# grab suffixes of 'variable' names 
suff <- unique(sub('^.*_', '', names(B[ , -1]))) 
# suff <- unique(tstrsplit(names(B[, -1]), "_")[[2]]) 

# melt 
B2 <- melt(B, measure = patterns("^dog", "^cat"), value.name = c("dog", "cat")) 

# replace factor levels in 'variable' with the suffixes 
setattr(B2$variable, "levels", suff) 

B2 
#  idcol variable dog cat 
# 1:  1  one 1 101 
# 2:  2  one 2 102 
# 3:  3  one 3 103 
# 4:  4  one 4 104 
# 5:  5  one 5 105 
# 6:  1  two 6 106 
# 7:  2  two 7 107 
# 8:  3  two 8 108 
# 9:  4  two 9 109 
# 10:  5  two 10 110 
# 11:  1 three 11 111 
# 12:  2 three 12 112 
# 13:  3 three 13 113 
# 14:  4 three 14 114 
# 15:  5 three 15 115 

Обратите внимание, что есть открытый вопрос на эту тему с некоторыми другими альтернативами: FR: expansion of melt functionality for handling names of output.


Это один из (редких) случаях, когда я считаю good'ol base::reshape чище. Его sep аргумента пригодится здесь - как имена столбца «значения» и уровни переменных «» столбцов генерируются на одном дыхании:

reshape(data = B, 
     varying = names(B[ , -1]), 
     sep = "_", 
     direction = "long") 
+3

да, переменные цв. уровни должны быть построены вручную еще .. Thumbs up for base :: reshape. – Arun

+0

Ссылка на github очень полезна! – Nancy

Смежные вопросы