2017-01-26 18 views
6

Tôi đang sử dụng đối số patterns() trong data.table::melt() để làm nóng dữ liệu có các cột có nhiều mẫu được xác định dễ dàng. Nó đang làm việc, nhưng tôi không thấy làm thế nào tôi có thể tạo ra một biến chỉ số ký tự thay vì phân tích số mặc định.Chuyển đổi biểu diễn dạng số của cột 'biến' sang chuỗi gốc sau khi làm tan chảy các mẫu

Ví dụ, trong một cột chó và mèo được đánh số ... hãy nhìn vào cột "biến":

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 

Tuy nhiên, trong B các cột chó và mèo được đánh số với văn bản , nhưng cột "biến" vẫn là số.

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 

Làm cách nào để điền vào cột "biến" với một/hai/ba thay vì 1/2/3?

Trả lời

7

Có thể có nhiều cách dễ dàng hơn, nhưng điều này dường như làm việc:

# 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 

Lưu ý rằng có một vấn đề mở về vấn đề này với một số lựa chọn thay thế khác: FR: expansion of melt functionality for handling names of output.


Đây là một trong những trường hợp hiếm hoi mà tôi tin rằng good'ol base::reshape là sạch hơn. Đối số sep có ích ở đây - cả hai tên của cột 'giá trị' và cấp độ của các cột 'biến' được tạo trong một lần:

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

có, biến col. mức độ cần phải được xây dựng bằng tay vẫn còn .. Thumbs up cho base :: reshape. – Arun

+0

Liên kết vấn đề github cực kỳ hữu ích! – Nancy

Các vấn đề liên quan