2015-07-10 55 views
5

我使用DESeq2包安装一个GLM在DESeq2模型用作嵌套的因素,其中有个人(RatIDs)嵌套在治疗(饮食)内的情况。包的作者表明个体从1重新拉平:(DESeq2 vignette, page 35)N各饮食(其中,N是RatIDs的特定饮食中的数字),而不是它们的原始ID /因子水平内平层因素,以促进R中

的数据看起来是这样的(其实有更多的行和列,但为简单起见省略):

 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 

这里是一个dput()输出结构:

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") 

可有人请注明优雅w ^可以在Diet中为RatIDs生成新的因子水平,作为上述数据框的附加列。 这可以通过data.table的roll函数来完成吗?

希望的输出(手动完成):

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 

注意:有不相等数目的各处理大鼠。我还希望解决方案不要重新排序数据中的行(如果可能的话)。

编辑:有没有“自然”为了将RatIDs,就像只要有一个1:饮食中的1映射,它的罚款。

+0

match

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

或者类似的选项,我想新的ID是从1:N每种饮食中,但您的建议给出了1:N整个饮食。将修改我的问题来强调这一点! – Meep

+0

我没有强调它,但也有来自同一大鼠多个样品(大鼠11有两个)。当我跑上述时,Rat 11获得两个ID。 RatID的顺序在映射到新ID时不必保留。 – Meep

+0

你是对的,那里有人为错误。将解决。 – Meep

回答

2

你可在“RatID”转换为“因素”,并迫使它回到“数字”

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 

或者使用与base R

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

正是我想要的!感谢:D – Meep

+1

哎呀,提高了投票,并没有意识到我也需要打勾。谢谢! – Meep

+0

您可能会发现这种混淆,但我只需要为我的数据集中的时间点子集生成ID。这些ID是使用上述正确生成的,但我注意到因子中的水平比成员'qsd = data.table(qsd) setkey(qsd,Days) ##只在嵌套饮食效果治疗,因此时间点94,105,126,133 qsd [c(“94”,“105”,“126”,“133”),RatIDByDiet:= as.numeric(factor(RatID,levels = unique(RatID))),by =饮食]' – Meep

1

这里是as.numeric(factor(.))把戏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 

这里是避免通过factor()去解决,如果你想通过编号是如何发生的更多的控制权:

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

问题我可以看到的是,鼠11(有两个样品,都同样的饮食),但被分配不同的ID。 – Meep

+0

@你是对的。固定。我仍然在寻找一种替代方法,它不需要'as.numeric(factor())',但尚未成功。 –

+0

@Meep解决了它。毕竟这不是很难。 ---啊,现在我看到Akrun也有这个选择。 –