我在R中有一个数据表:
library(data.table)
set.seed(1234)
DT <- data.table(x=rep(c(1,2,3),each=4), y=c("A","B"), v=sample(1:100,12))
DT
x y v
[1,] 1 A 12
[2,] 1 B 62
[3,] 1 A 60
[4,] 1 B 61
[5,] 2 A 83
[6,] 2 B 97
[7,] 2 A 1
[8,] 2 B 22
[9,] 3 A 99
[10,] 3 B 47
[11,] 3 A 63
[12,] 3 B 49
Run Code Online (Sandbox Code Playgroud)
我可以通过data.table中的组轻松地对变量v求和:
out <- DT[,list(SUM=sum(v)),by=list(x,y)]
out
x y SUM
[1,] 1 A 72
[2,] 1 B 123
[3,] 2 …Run Code Online (Sandbox Code Playgroud) 我有一个大data.frame的前三列包含有关标记的信息.其余列是每个人中该标记的数字类型.每个人都有三列.数据集如下所示:
marker alleleA alleleB X818 X818.1 X818.2 X345 X345.1 X345.2 X346 X346.1 X346.2
1 kgp5209280_chr3_21902067 T A 0.0000 1.0000 0.0000 1.0000 0.0000 0.0000 0.0000 1.0000 0.0000
2 chr3_21902130_21902131_A_T A T 0.8626 0.1356 0.0018 0.7676 0.2170 0.0154 0.8626 0.1356 0.0018
3 chr3_21902134_21902135_T_C T C 0.6982 0.2854 0.0164 0.5617 0.3749 0.0634 0.6982 0.2854 0.0164
Run Code Online (Sandbox Code Playgroud)
也就是说,对于每个标记(行),每个个体具有三个值,每列一个.
我想创建一个新的data.frame,它具有与原始行相同的所有行,但每个人只有一列.在每个人的一栏中,我希望每个人的三个值大于0.8.如果没有大于0.8的值,那么我想打印NA.例如,在我为第一行给出的数据集中,我希望第二个值为818(1.0000),第一个值为345(1.0000).在第二行中,我想要第一个值为818(0.8626),而对于345,没有一个值高于0.8,所以我希望NA打印,依此类推.因此,新数据集如下所示:
marker alleleA alleleB X818 X345
1 kgp5209280_chr3_21902067 T A 1.0000 1
2 chr3_21902130_21902131_A_T A T 0.8626 NA
Run Code Online (Sandbox Code Playgroud)
我一直试图使用if/else语句, …
我想用它data.table作为替代aggregate()或者ddply(),因为这两种方法不能像希望的那样有效地扩展到大对象.不幸的是,我还没有弄清楚如何让向量返回聚合函数在结果中生成多个列data.table.例如:
# required packages
library(plyr)
library(data.table)
# simulated data
x <- data.table(value=rnorm(100), g=rep(letters[1:5], each=20))
# ddply output that I would like to get from data.table
ddply(data.frame(x), 'g', function(i) quantile(i$value))
g 0% 25% 50% 75% 100%
1 a -1.547495 -0.7842795 0.202456288 0.6098762 2.223530
2 b -1.366937 -0.4418388 -0.085876995 0.7826863 2.236469
3 c -2.064510 -0.6411390 -0.257526983 0.3213343 1.039053
4 d -1.773933 -0.5493362 -0.007549273 0.4835467 2.116601
5 e -0.780976 -0.2315245 0.194869630 0.6698881 2.207800
# not …Run Code Online (Sandbox Code Playgroud)