bw4*_*4sz 5 r bigdata data.table
我有一个类似的问题:R:data.table:搜索多列和设置数据类型,但这个问题没有得到完全解答.我有一个成对表,在概念上看起来像下面的那个.该表是将非常大的距离矩阵转换为data.table(> 100,000,000行)的结果,使得比较a,b与b,a相同.但是,a和b可能出现在V1或V2列中.我想使用data.table的查询样式计算简单的汇总统计信息,但我还没有弄清楚如何在任一列中选择键.这可能吗?
我已尝试在任一方向设置密钥,但这只返回该列的数据.我也尝试使用list(),但是返回交集(可以理解),我希望有一个by = key1 | key2,但没有这样的运气.
> set.seed(123)
>
> #create pairwise data
> a<-data.table(t(combn(3,2)))
> #create column that is equal both ways, 1*2 == 2*1
> dat<-a[,data:=V1*V2]
> dat
V1 V2 data
1: 1 2 2
2: 1 3 3
3: 2 3 6
#The id ==2 is the problem here, the mean should be 4 ((2+6)/2)
> #set keys
> setkey(dat,V1,V2)
>
> #One way data
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=V1]
> dat
V1 V2 data MEAN VAR
1: 1 2 2 2.5 0.5
2: 1 3 3 2.5 0.5
3: 2 3 6 6.0 NA
> #The other way
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=V2]
> dat
V1 V2 data MEAN VAR
1: 1 2 2 2.0 NA
2: 1 3 3 4.5 4.5
3: 2 3 6 4.5 4.5
>
> #The intersect just produces the original data
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=list(V1,V2)]
> dat
V1 V2 data MEAN VAR
1: 1 2 2 2 NA
2: 1 3 3 3 NA
3: 2 3 6 6 NA
>
> #Meaningless but hopefull attempt.
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=V1|V2]
> dat
V1 V2 data MEAN VAR
1: 1 2 2 3.666667 4.333333
2: 1 3 3 3.666667 4.333333
3: 2 3 6 3.666667 4.333333
#The goal is to create a table would look like this (using mean as an example)
ID MEAN
1 2.5
2 4.0
3 4.5
Run Code Online (Sandbox Code Playgroud)
我默认的想法是通过DAT [V1 == X | V2 == X]太循环语句,但我不认为我利用的data.table全功率返回一个单一的id柱,意味着var作为摘要列.
谢谢!
最容易重新排列您的数据以实现您想要的(我正在使用data下面的回收而不是输入c(data, data)第一部分):
dat[, list(c(V1, V2), data)][, list(MEAN = mean(data)), by = V1]
# V1 MEAN
#1: 1 2.5
#2: 2 4.0
#3: 3 4.5
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2337 次 |
| 最近记录: |