我试着找出V3
列中是否有一个字母出现在两个因子组V1
和V2
的每一个中。很清楚我对一些数据的意思:
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()
我能够找到V2
和V1
所有要素级别中出现的字母。
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不是重复的问题。