基于行数设置数据子集True

yc0p9oo0  于 2023-06-27  发布在  其他
关注(0)|答案(1)|浏览(104)

在R中,我有一个包含10列的数据集。这些列是二进制的,其中1表示真,2表示假。我需要对数据进行子集化,以找出只有2列等于1,只有3列等于1等的次数问题是--我不在乎哪个3等于1,我只需要3的任何组合等于1的次数的数据。
这是我找到这个的唯一方法,但是我必须为每个组合编写所有这些代码,这对于1023种可能的组合来说太繁琐了。
a1x3 <- filter(ALL_STATES_TBL, ace3 == "1" & ace4 == "2" & ace5 == "2" & ace6 == "2" & ace7 == "2" & ace8 == "2" & ace9 == "2")a1x3t <- filter(a1x3, ace1 == "3")a1x3tt <- filter(a1x3, ace1 == "4")a1x3 <- rbind(a1x3t, a1x3tt)
任何帮助将不胜感激![另外,代码是这样写的,因为ace 1有4个选项而不是2个]。

xytpbqjk

xytpbqjk1#

我们可以通过n列迭代子集,等于== 1,并计算rowSumsn的次数。combn执行所有组合工作。

f <- \(x) {
  sq <- seq_along(x)[-1]
  sapply(setNames(sq, sq), \(n) 
         sum(unlist(combn(ncol(x), n, \(j) rowSums(x[, j] == 1) == n))))
}

考虑此数据框。

dat1
#   V1 V2 V3 V4
# 1  1  1  2  2
# 2  1  2  2  1
# 3  1  2  1  2

f(dat1)
# 2 3 4 
# 3 0 0

或者这一个

dat2
#   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
# 1  1  2  1  1  1  2  2  2  1   2
# 2  1  2  2  2  1  1  2  1  1   2
# 3  1  2  1  2  1  1  2  2  2   2
# 4  1  1  2  2  1  1  2  2  2   2
# 5  2  2  1  2  1  1  1  2  2   1

f(dat2)
#  2  3  4  5  6  7  8  9 10 
# 42 38 17  3  0  0  0  0  0
  • 数据:*
set.seed(42)
dat1 <- as.data.frame(matrix(sample(1:2, 12, replace=TRUE), 3, 4))

set.seed(42)
dat2 <- as.data.frame(matrix(sample(1:2, 50, replace=TRUE), 5, 10))

相关问题