如何更改split在R中返回值的方式?

如何更改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

我在做一个项目,我想取一个矩阵,将它除以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  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