2015-07-10 15 views
5

Tôi đang lắp GLM bằng gói DESeq2 và có tình huống cá nhân (RatID) được lồng trong điều trị (Chế độ ăn). Tác giả của gói cho thấy rằng các cá nhân được tái san bằng từ 1: N trong mỗi Chế độ ăn uống (trong đó N là số lượng các RatID trong một Chế độ ăn cụ thể) thay vì ID/yếu tố ban đầu của chúng (DESeq2 vignette, page 35.)Yếu tố phát sinh để tạo thuận lợi cho việc sử dụng như yếu tố lồng nhau trong mô hình DESeq2 trong R

dữ liệu trông giống như thế này (có thực sự nhiều cột và các hàng, nhưng bỏ qua vì đơn giản):

 Diet Extraction RatID 
199 HAMSP   8 65 
74 HAMS   9 108 
308 HAMS   18 100 
41 HAMSA   3 83 
88 HAMSP   12 11 
221 HAMSP   14 66 
200 HAMSA   8 57 
155 HAMSB   1 105 
245 HAMSB   19 50 
254 HAMS   21 90 
182 HAMSB   4  4 
283 HAMSA   23 59 
180 HAMSP   4 22 
71 HAMSP   9 112 
212 HAMS   12 63 
220 HAMSP   14 54 
56 HAMS   7 81 
274 HAMSP   1 11 
114 HAMS   17 102 
143 HAMSP   22 93 

và đây là một đầu ra dput() cho cấu trúc:

data = structure(list(Diet = structure(c(4L, 1L, 1L, 2L, 4L, 4L, 2L, 
     3L, 3L, 1L, 3L, 2L, 4L, 4L, 1L, 4L, 1L, 4L, 1L, 4L), .Label = c("HAMS", 
     "HAMSA", "HAMSB", "HAMSP", "LAMS"), class = "factor"), Extraction = c(8L, 
     9L, 18L, 3L, 12L, 14L, 8L, 1L, 19L, 21L, 4L, 23L, 4L, 9L, 12L, 
     14L, 7L, 1L, 17L, 22L), RatID = structure(c(61L, 7L, 3L, 76L, 
     9L, 62L, 52L, 6L, 46L, 81L, 37L, 54L, 20L, 12L, 59L, 50L, 74L, 
     9L, 4L, 84L), .Label = c("1", "10", "100", "102", "103", "105", 
     "108", "109", "11", "110", "111", "112", "113", "13", "14", "16", 
     "17", "18", "20", "22", "23", "24", "25", "26", "27", "28", "29", 
     "3", "30", "31", "32", "34", "35", "36", "37", "39", "4", "40", 
     "42", "43", "45", "46", "48", "49", "5", "50", "51", "52", "53", 
     "54", "55", "57", "58", "59", "6", "60", "61", "62", "63", "64", 
     "65", "66", "67", "68", "69", "70", "71", "73", "77", "78", "79", 
     "8", "80", "81", "82", "83", "85", "86", "88", "89", "90", "91", 
     "92", "93", "94", "95", "96", "98", "99"), class = "factor")), .Names = c("Diet", 
     "Extraction", "RatID"), row.names = c(199L, 74L, 308L, 41L, 88L, 
     221L, 200L, 155L, 245L, 254L, 182L, 283L, 180L, 71L, 212L, 220L, 
     56L, 274L, 114L, 143L), class = "data.frame") 

ai đó có thể xin ghi rõ một thanh lịch w ay để tạo ra các mức yếu tố mới cho các RatID trong Chế độ ăn uống dưới dạng cột bổ sung của data.frame ở trên. Điều này có thể được thực hiện với chức năng cuộn của dữ liệu.

đầu ra mong muốn (làm bằng tay):

Diet Extraction RatID newCol 
1 HAMSP   8 65  1 
2 HAMS   9 108  1 
3 HAMS   18 100  2 
4 HAMSA   3 83  1 
5 HAMSP   12 11  2 
6 HAMSP   14 66  3 
7 HAMSA   8 57  2 
8 HAMSB   1 105  1 
9 HAMSB   19 50  2 
10 HAMS   21 90  3 
11 HAMSB   4  4  3 
12 HAMSA   23 59  3 
13 HAMSP   4 22  4 
14 HAMSP   9 112  5 
15 HAMS   12 63  4 
16 HAMSP   14 54  6 
17 HAMS   7 81  5 
18 HAMSP   1 11  2 
19 HAMS   17 102  6 
20 HAMSP   22 93  7 

CHÚ Ý: Có không phải là một số lượng tương đương của Rats trong mỗi lần điều trị. Tôi cũng muốn giải pháp không sắp xếp lại các hàng trong dữ liệu (nếu có thể).

EDIT: Không có thứ tự 'tự nhiên' đối với các RatID, miễn là có ánh xạ 1: 1 trong chế độ ăn kiêng, tiền phạt của nó.

+0

Tôi muốn ID mới là từ 1: N trong mỗi chế độ ăn uống, nhưng đề nghị bạn cung cấp cho 1: N qua chế độ ăn. Sẽ sửa đổi câu hỏi của tôi để nhấn mạnh rằng bit! – Meep

+0

Tôi đã không nhấn mạnh nó, nhưng có nhiều mẫu từ cùng một con chuột (Rat 11 có hai). Khi tôi chạy ở trên, Rat 11 nhận được hai id. Thứ tự của RatID không cần phải được bảo toàn khi ánh xạ tới các ID mới. – Meep

+0

Bạn nói đúng, lỗi của con người ở đó. Sẽ sửa chữa. – Meep

Trả lời

2

Bạn có thể chuyển đổi 'RatID' thành 'factor' và ép nó trở lại thành 'numeric'

library(data.table)#v1.9.4+ 
setDT(data)[, newCol:=as.numeric(factor(RatID, 
         levels=unique(RatID))), Diet] 
#  Diet Extraction RatID newCol 
# 1: HAMSP   8 65  1 
# 2: HAMS   9 108  1 
# 3: HAMS   18 100  2 
# 4: HAMSA   3 83  1 
# 5: HAMSP   12 11  2 
# 6: HAMSP   14 66  3 
# 7: HAMSA   8 57  2 
# 8: HAMSB   1 105  1 
# 9: HAMSB   19 50  2 
#10: HAMS   21 90  3 
#11: HAMSB   4  4  3 
#12: HAMSA   23 59  3 
#13: HAMSP   4 22  4 
#14: HAMSP   9 112  5 
#15: HAMS   12 63  4 
#16: HAMSP   14 54  6 
#17: HAMS   7 81  5 
#18: HAMSP   1 11  2 
#19: HAMS   17 102  6 
#20: HAMSP   22 93  7 

Hoặc sử dụng match

setDT(data)[, newCol:=match(RatID, unique(RatID)), Diet] 

Hoặc tương tự tùy chọn với base R

data$newCol <- with(data, ave(as.numeric(levels(RatID))[RatID], 
     Diet, FUN=function(x) match(x, unique(x)))) 
+1

Chính xác những gì tôi muốn! Cảm ơn: D – Meep

+1

Rất tiếc, đã bỏ phiếu và không nhận ra tôi cũng cần đánh dấu. Cảm ơn! – Meep

+0

Bạn có thể thấy điều này khó hiểu, nhưng tôi chỉ cần tạo ID cho một tập hợp con của các điểm thời gian trong tập dữ liệu của tôi. Các ID được tạo chính xác bằng cách sử dụng ở trên, nhưng tôi nhận thấy rằng có nhiều cấp độ hơn so với các thành viên 'qsd = data.table (qsd) setkey (qsd, Days) ## chỉ gán hiệu ứng lồng nhau cho chuột trong chế độ ăn kiêng điều trị, do đó, các điểm thời gian 94,105,126,133 qsd [c ("94", "105", "126", "133"), RatIDByDiet: = as.numeric (yếu tố (RatID, levels = unique (RatID))), by = Chế độ ăn uống] ' – Meep

1

Đây là mẹo as.numeric(factor(.)) thực hiện trong dplyr:

require(dplyr) 
data %>% group_by(Diet) %>% mutate(RatIDByDiet=as.numeric(factor(RatID))) 
## Source: local data frame [20 x 4] 
## Groups: Diet 
## 
##  Diet Extraction RatID RatIDByDiet 
## 1 HAMSP   8 65   5 
## 2 HAMS   9 108   3 
## 3 HAMS   18 100   1 
## 4 HAMSA   3 83   3 
## 5 HAMSP   12 11   1 
## 6 HAMSP   14 66   6 
## 7 HAMSA   8 57   1 
## 8 HAMSB   1 105   1 
## 9 HAMSB   19 50   3 
## 10 HAMS   21 90   6 
## 11 HAMSB   4  4   2 
## 12 HAMSA   23 59   2 
## 13 HAMSP   4 22   3 
## 14 HAMSP   9 112   2 
## 15 HAMS   12 63   4 
## 16 HAMSP   14 54   4 
## 17 HAMS   7 81   5 
## 18 HAMSP   1 11   1 
## 19 HAMS   17 102   2 
## 20 HAMSP   22 93   7 

Và đây là một giải pháp mà tránh đi qua factor(), nếu bạn muốn kiểm soát nhiều hơn cách đánh số sẽ xảy ra:

data %>% group_by(Diet) %>% mutate(RatIDByDiet=match(RatID, unique(RatID))) 
## Source: local data frame [20 x 4] 
## Groups: Diet 
## 
##  Diet Extraction RatID RatIDByDiet 
## 1 HAMSP   8 65   1 
## 2 HAMS   9 108   1 
## 3 HAMS   18 100   2 
## 4 HAMSA   3 83   1 
## 5 HAMSP   12 11   2 
## 6 HAMSP   14 66   3 
## 7 HAMSA   8 57   2 
## 8 HAMSB   1 105   1 
## 9 HAMSB   19 50   2 
## 10 HAMS   21 90   3 
## 11 HAMSB   4  4   3 
## 12 HAMSA   23 59   3 
## 13 HAMSP   4 22   4 
## 14 HAMSP   9 112   5 
## 15 HAMS   12 63   4 
## 16 HAMSP   14 54   6 
## 17 HAMS   7 81   5 
## 18 HAMSP   1 11   2 
## 19 HAMS   17 102   6 
## 20 HAMSP   22 93   7 
+0

Một vấn đề tôi có thể thấy là Rat 11 (có hai mẫu, cả hai chế độ ăn uống), nhưng được gán các ID khác nhau. – Meep

+0

@Meep Bạn chính xác. Đã sửa. Tôi vẫn đang tìm một cách khác để làm điều này mà không yêu cầu 'as.numeric (factor())', nhưng vẫn chưa thành công. –

+0

@Meep giải quyết nó. Dù sao thì cũng không quá khó. --- Ah, bây giờ tôi thấy rằng Akrun cũng đã có lựa chọn đó. –

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