我想重塑一个宽格式数据集,该数据集具有多个测试,这些测试在3个时间点进行测量:
ID Test Year Fall Spring Winter
1 1 2008 15 16 19
1 1 2009 12 13 27
1 2 2008 22 22 24
1 2 2009 10 14 20
2 1 2008 12 13 25
2 1 2009 16 14 21
2 2 2008 13 11 29
2 2 2009 23 20 26
3 1 2008 11 12 22
3 1 2009 13 11 27
3 2 2008 17 12 23
3 2 2009 14 9 31
Run Code Online (Sandbox Code Playgroud)
进入一个按列分隔测试的数据集,但将测量时间转换为长格式,对于每个新列,如下所示: …
我有一个大约300万行的数据集和以下结构:
PatientID| Year | PrimaryConditionGroup
---------------------------------------
1 | Y1 | TRAUMA
1 | Y1 | PREGNANCY
2 | Y2 | SEIZURE
3 | Y1 | TRAUMA
Run Code Online (Sandbox Code Playgroud)
作为R的新手,我在找到将数据重塑为下面结构的正确方法时遇到了一些麻烦:
PatientID| Year | TRAUMA | PREGNANCY | SEIZURE
----------------------------------------------
1 | Y1 | 1 | 1 | 0
2 | Y2 | 0 | 0 | 1
3 | Y1 | 1 | 0 | 1
Run Code Online (Sandbox Code Playgroud)
我的问题是:创建data.frame的最快/最优雅的方法是什么,其中PrimaryConditionGroup的值成为列,按PatientID和Year(计算出现的次数)分组?
如果这些值按组存储在data.table的单个列中(除了将data.table转换为矩阵之外),是否有一种优雅计算值之间相关性的方法?
library(data.table)
set.seed(1) # reproducibility
dt <- data.table(id=1:4, group=rep(letters[1:2], c(4,4)), value=rnorm(8))
setkey(dt, group)
# id group value
# 1: 1 a -0.6264538
# 2: 2 a 0.1836433
# 3: 3 a -0.8356286
# 4: 4 a 1.5952808
# 5: 1 b 0.3295078
# 6: 2 b -0.8204684
# 7: 3 b 0.4874291
# 8: 4 b 0.7383247
Run Code Online (Sandbox Code Playgroud)
有效的东西,但需要组名作为输入:
cor(dt["a"]$value, dt["b"]$value)
# [1] 0.1556371
Run Code Online (Sandbox Code Playgroud)
我正在寻找更多类似的东西:
dt[, cor(value, value), by="group"]
Run Code Online (Sandbox Code Playgroud)
但这并没有给我我追求的相关性.
对于具有正确结果的矩阵,这是同样的问题.
set.seed(1) # reproducibility
m <- matrix(rnorm(8), ncol=2)
dimnames(m) <- list(id=1:4, …Run Code Online (Sandbox Code Playgroud) 假设我有一个data.table"融化"的形式,我有一个键,标识符和值
library(data.table)
library(reshape2)
DT = data.table(X = c(1:5, 1:4), Y = c(rep("A", 5), rep("B", 4)), Z = rnorm(9))
DT2 = data.table(dcast(DT, X~Y))
Run Code Online (Sandbox Code Playgroud)
我怎样才能在里面进行那种自我加入data.table?
> DT
X Y Z
1: 1 A -0.19790449
2: 2 A 0.17906116
3: 3 A 0.01821837
4: 4 A 0.17309716
5: 5 A 0.05962474
6: 1 B -0.24629468
7: 2 B 0.92285734
8: 3 B 0.66002573
9: 4 B -1.01403880
> DT2
X A B
1: 1 -0.19790449 -0.2462947
2: 2 0.17906116 …Run Code Online (Sandbox Code Playgroud) 我在R中有一个大数据表:
library(data.table)
set.seed(1234)
n <- 1e+07*2
DT <- data.table(
ID=sample(1:200000, n, replace=TRUE),
Month=sample(1:12, n, replace=TRUE),
Category=sample(1:1000, n, replace=TRUE),
Qty=runif(n)*500,
key=c('ID', 'Month')
)
dim(DT)
Run Code Online (Sandbox Code Playgroud)
我想调整这个data.table,使Category成为一个列.不幸的是,由于组内的类别数量不恒定,我不能使用这个答案.
我有什么想法可以做到这一点?
/编辑:基于joran的评论和flodel的回答,我们正在重塑以下内容data.table:
agg <- DT[, list(Qty = sum(Qty)), by = c("ID", "Month", "Category")]
Run Code Online (Sandbox Code Playgroud)
这种重塑可以通过多种方式实现(到目前为止我已经得到了一些好的答案),但我真正想要的是能够很好地扩展到data.table数百万行和数百到数千种类别的东西.
我有一个大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
set.seed(123); N=1e5
DT = data.table(x=rnorm(N), y=sample(c('a','b','c'),N,T))
probs = seq(.1,1,.1); newCols <- paste("q",100*probs,sep="");
DT2 <- DT[ ,list(Q=list(quantile(x,probs=probs))),by=y]
DT2
# y Q
#1: b -1.2817037351734,-0.840293441466144,-0.525195748246148,-0.259574774974136,
#2: c -1.26975023312311,-0.832359658553173,-0.513320691339448,-0.247863323660894,
#3: a -1.28189935066568,-0.838918942382995,-0.522409189372727,-0.257356179072232,
#Here I want to create 10 columns from Q called q10, q20...
DT2[ , newCols:=Q] #can't make this work because it is evaluated in the wrong environment I guess
Run Code Online (Sandbox Code Playgroud) 我有一个大矩阵 num [1:62410, 1:48010]
我想要一个长格式的 data.table
例如
Var1 Var2 value
1: 1 1 -4227.786
2: 2 1 -4211.908
3: 3 1 -4197.034
4: 4 1 -4183.645
5: 5 1 -4171.692
6: 6 1 -4161.634
Run Code Online (Sandbox Code Playgroud)
最小的例子
m = matrix(1:5, nrow = 1000, ncol = 1000)
x = data.table(reshape2::melt(m))
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望同时列名 x、y 和 value。
以前我一直在使用data.table(melt(mymatrix)). 但是从reshape2::melt已弃用的警告来看,这在速度方面可能不是最佳的,解决这个问题的最佳“data.table”方法是什么?
以下不回答我的问题: 快速融化的数据表操作 正确/最快的方法来重塑数据表
其他答案参考已弃用的reshape2软件包
r ×8
data.table ×5
reshape ×2
correlation ×1
dataframe ×1
if-statement ×1
loops ×1
melt ×1
performance ×1
reshape2 ×1