如何更改split在R中返回值的方式?
我在做一个项目,我想取一个矩阵,将它除以w和x的值,然后对每个值求y的最大值。 下面是一个示例矩阵如何更改split在R中返回值的方式?,r,split,R,Split,我在做一个项目,我想取一个矩阵,将它除以w和x的值,然后对每个值求y的最大值。 下面是一个示例矩阵 >rah = cbind(w = 1:6, x = 1:3, y = 12:1, z = 1:12) >rah w x y z [1,] 1 1 12 1 [2,] 2 2 11 2 [3,] 3 3 10 3 [4,] 4 1 9 4 [5,] 5 2 8 5 [6,] 6 3 7 6 [7,] 1 1 6 7 [8,] 2 2
>rah = cbind(w = 1:6, x = 1:3, y = 12:1, z = 1:12)
>rah
w x y z
[1,] 1 1 12 1
[2,] 2 2 11 2
[3,] 3 3 10 3
[4,] 4 1 9 4
[5,] 5 2 8 5
[6,] 6 3 7 6
[7,] 1 1 6 7
[8,] 2 2 5 8
[9,] 3 3 4 9
[10,] 4 1 3 10
[11,] 5 2 2 11
[12,] 6 3 1 12
所以我分头跑
> doh = split(rah, list(rah[,1], rah[,2]))
> doh
$`1.1`
[1] 1 1 1 1 12 6 1 7
$`2.1`
integer(0)
$`3.1`
integer(0)
$`4.1`
[1] 4 4 1 1 9 3 4 10
$`5.1`
integer(0)
$`6.1`
integer(0)
$`1.2`
integer(0)
$`2.2`
[1] 2 2 2 2 11 5 2 8
$`3.2`
integer(0)
$`4.2`
integer(0)
$`5.2`
[1] 5 5 2 2 8 2 5 11
...
所以我有点困惑,如何获取split的输出,并使用它对具有匹配的w和x值组合的行进行排序(例如第1行与第7行进行比较),然后比较它们以找到具有高y值的行
编辑:到目前为止答案信息丰富,但我刚刚意识到我忘了提到一个非常重要的部分:我想保留整行(x,w,y,z) 改用
聚合
> aggregate(y ~ w + x, max, data=rah)
w x y
1 1 1 12
2 4 1 9
3 2 2 11
4 5 2 8
5 3 3 10
6 6 3 7
如果要使用拆分
,请尝试
> split_rah <- split(rah[,"y"], list(rah[, "w"], rah[, "x"]))
> ind <- sapply(split_rah, function(x) length(x)>0)
> sapply(split_rah[ind], max)
1.1 4.1 2.2 5.2 3.3 6.3
12 9 11 8 10 7
数据表解决方案:
> library(data.table)
> dt <- data.table(rah)
> dt[, max(y), by=list(w, x)]
w x V1
1: 1 1 12
2: 2 2 11
3: 3 3 10
4: 4 1 9
5: 5 2 8
6: 6 3 7
>库(data.table)
>dt[,max(y),by=列表(w,x)]
w x V1
1: 1 1 12
2: 2 2 11
3: 3 3 10
4: 4 1 9
5: 5 2 8
6: 6 3 7
使用plyr
软件包的另一个选项:
ddply(as.data.frame(rah),.(w,x),summarize,z=max(y))
w x z
1 1 1 12
2 2 2 11
3 3 3 10
4 4 1 9
5 5 2 8
6 6 3 7
ddply(as.data.frame(rah),.(w,x),summarize,z=max(y))
w x z
1 1 1 12
2 2 2 11
3 3 3 10
4 4 1 9
5 5 2 8
6 6 3 7
> tapply(rah[,"y"], list( rah[,"w"], rah[,"x"]), max)
1 2 3
1 12 NA NA
2 NA 11 NA
3 NA NA 10
4 9 NA NA
5 NA 8 NA
6 NA NA 7