比较每个组中

时间:2017-03-02 07:29:04

标签: r

考虑R中的数据框:

set.seed(36)

y <- runif(10,0,200)
group <- sample(rep(1:2, each=5))
d <- data.frame(y, group)

我想将所有y与每个组中的所有y进行比较。以下代码正确执行此操作:

d_split <- split(d, d$group)
a <- with(d_split[[1]],outer(y, y, "<="))
b <- with(d_split[[2]],outer(y, y, "<="))

但是当我在函数内部执行此操作时,并且组的数量不同(group将是该函数的参数),那么我无法以这种方式继续。如何优雅地编写最后三行代码,以便将所有y与每个组中的所有y进行比较?

2 个答案:

答案 0 :(得分:4)

要对多个组执行相同的操作,我们可以使用lapply并对每个组执行outer操作。

lapply(split(d, d$group), function(x) outer(x[["y"]], x[["y"]], "<="))

#$`1`
#      [,1] [,2]  [,3]  [,4]  [,5]
#[1,]  TRUE TRUE FALSE FALSE FALSE
#[2,] FALSE TRUE FALSE FALSE FALSE
#[3,]  TRUE TRUE  TRUE FALSE  TRUE
#[4,]  TRUE TRUE  TRUE  TRUE  TRUE
#[5,]  TRUE TRUE FALSE FALSE  TRUE

#$`2`
#      [,1]  [,2]  [,3] [,4]  [,5]
#[1,]  TRUE  TRUE FALSE TRUE FALSE
#[2,] FALSE  TRUE FALSE TRUE FALSE
#[3,]  TRUE  TRUE  TRUE TRUE  TRUE
#[4,] FALSE FALSE FALSE TRUE FALSE
#[5,]  TRUE  TRUE FALSE TRUE  TRUE

答案 1 :(得分:3)

这是一个没有split ting

的选项
library(data.table)
setDT(d)[, as.data.table(outer(y, y, "<=")), group]
#    group    V1    V2    V3    V4    V5
#1:     1  TRUE  TRUE FALSE FALSE FALSE
#2:     1 FALSE  TRUE FALSE FALSE FALSE
#3:     1  TRUE  TRUE  TRUE FALSE  TRUE
#4:     1  TRUE  TRUE  TRUE  TRUE  TRUE
#5:     1  TRUE  TRUE FALSE FALSE  TRUE
#6:     2  TRUE  TRUE FALSE  TRUE FALSE
#7:     2 FALSE  TRUE FALSE  TRUE FALSE
#8:     2  TRUE  TRUE  TRUE  TRUE  TRUE
#9:     2 FALSE FALSE FALSE  TRUE FALSE
#10:    2  TRUE  TRUE FALSE  TRUE  TRUE

或者在长期&#39;格式为CJ

setDT(d)[, CJ(y, y), group][, V1 <= V2, group]