值的计数取决于两个因素

时间:2016-10-11 15:05:22

标签: r count aggregate

我试着找出V3列中是否有一个字母出现在两个因子组V1V2的每一个中。很清楚我对一些数据的意思:

df <- structure(list(a = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
3L, 3L, 3L, 3L, 3L), b = c(4L, 5L, 5L, 6L, 6L, 5L, 6L, 6L, 6L, 
6L, 4L, 4L, 5L, 5L, 5L), d = structure(c(3L, 3L, 3L, 2L, 3L, 
2L, 1L, 4L, 2L, 3L, 4L, 1L, 1L, 4L, 3L), .Label = c("a", "b", 
"c", "d"), class = "factor")), .Names = c("V1", "V2", "V3"), row.names = c(NA, 
-15L), class = "data.frame")

df
   V1 V2 V3
1  1 4 c
2  1 5 c
3  1 5 c
4  1 6 b
5  1 6 c
6  2 5 b
7  2 6 a
8  2 6 d
9  2 6 b
10 2 6 c
11 3 4 d
12 3 4 a
13 3 5 a
14 3 5 d
15 3 5 c

因此,对于第一组V1 == 1,有三个级别V2 = c(4, 5, 6),并且在每个级别"c"中都有一个V3。我的预期输出将是这样的,将所有"c"设置为TRUE并将第4行中的"b"设置为FALSE,因为它不会出现在所有组中。对于V1 == 2,我们在V2中观察了两个级别c(5, 6),现在是所有级别的"b"字母。因此"b"在这里TRUE而其他所有人(c("a", "d", "c"))都不在(FALSE)。

   a b d     e
1  1 4 c  TRUE
2  1 5 c  TRUE
3  1 5 c  TRUE
4  1 6 b FALSE
5  1 6 c  TRUE
6  2 5 b  TRUE
7  2 6 a FALSE
8  2 6 d FALSE
9  2 6 b  TRUE
10 2 6 c FALSE
11 3 4 d  TRUE
12 3 4 a  TRUE
13 3 5 a  TRUE
14 3 5 d  TRUE
15 3 5 c FALSE

使用split()table()我能够找到V2V1所有要素级别中出现的字母。

a1 <- lapply(split(df, df$V1), function(x) names(which(apply(table(x$V3, x$V2) != 0, 1, all))))
a1
$`1`
[1] "c"

$`2`
[1] "b"

$`3`
[1] "a" "d"

现在我可以再次拆分数据框搜索字母,并使用类似的东西创建逻辑矢量。

unlist(Map(function(x, y) x$V3 %in% y, split(df, df$V1), a1))
 11    12    13    14    15    21    22    23    24    25    31    32    33    34    35 
 TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE 

但这很不方便,远离优雅的解决方案。问题是,IMO不是重复的问题。

0 个答案:

没有答案