捕获列模式频率
capture column pattern frequency
我有一个像下面这样的数据集
Id A B C
10 1 0 1
11 1 0 1
12 1 1 0
13 1 0 0
14 0 1 1
我正在尝试像下面这样计算列模式。
Pattern Count
A, C 2
A, B 1
A 1
B, C 1
不确定从哪里开始,非常感谢任何帮助或建议。
如果您不必按 ID 分组,那么只需
table(apply(df[-1], 1, function(i) paste(names(i[i == 1]), collapse = ',')))
# A A,B A,C B,C
# 1 1 2 1
我们可以试试
table(gsub(",*N|N,*", "", chartr('0123', 'NABC',
do.call(paste, c(df1[-1] * col(df1[-1]), sep=",")))))
# A A,B A,C B,C
# 1 1 2 1
正如@DavidArenburg 提到的,chartr
中的 old/new
可以通过
自动生成
cols <- paste(c("N", names(df1[-1])), collapse = "")
indx <- paste(seq(nchar(cols)) - 1, collapse = "")
table(gsub(",*N|N,*", "", chartr(indx, cols,
do.call(paste, c(df1[-1] * col(df1[-1]), sep=",")))))
从 "reversing" 两个独立向量中的数据列表开始:
w = which(dat[-1] == 1L, TRUE)
我们可以使用
table(tapply(names(dat)[-1][w[, "col"]], w[, "row"], paste, collapse = ", "))
#
# A A, B A, C B, C
# 1 1 2 1
如果结果不需要仅用于格式化目的,为了避免不必要的 paste
/strsplit
,一个替代方案是:
pats = split(names(dat)[-1][w[, "col"]], w[, "row"])
upats = unique(pats)
data.frame(pat = upats, n = tabulate(match(pats, upats)))
# pat n
#1 A, C 2
#3 A, B 1
#4 A 1
#5 B, C 1
我有一个像下面这样的数据集
Id A B C
10 1 0 1
11 1 0 1
12 1 1 0
13 1 0 0
14 0 1 1
我正在尝试像下面这样计算列模式。
Pattern Count
A, C 2
A, B 1
A 1
B, C 1
不确定从哪里开始,非常感谢任何帮助或建议。
如果您不必按 ID 分组,那么只需
table(apply(df[-1], 1, function(i) paste(names(i[i == 1]), collapse = ',')))
# A A,B A,C B,C
# 1 1 2 1
我们可以试试
table(gsub(",*N|N,*", "", chartr('0123', 'NABC',
do.call(paste, c(df1[-1] * col(df1[-1]), sep=",")))))
# A A,B A,C B,C
# 1 1 2 1
正如@DavidArenburg 提到的,chartr
中的 old/new
可以通过
cols <- paste(c("N", names(df1[-1])), collapse = "")
indx <- paste(seq(nchar(cols)) - 1, collapse = "")
table(gsub(",*N|N,*", "", chartr(indx, cols,
do.call(paste, c(df1[-1] * col(df1[-1]), sep=",")))))
从 "reversing" 两个独立向量中的数据列表开始:
w = which(dat[-1] == 1L, TRUE)
我们可以使用
table(tapply(names(dat)[-1][w[, "col"]], w[, "row"], paste, collapse = ", "))
#
# A A, B A, C B, C
# 1 1 2 1
如果结果不需要仅用于格式化目的,为了避免不必要的 paste
/strsplit
,一个替代方案是:
pats = split(names(dat)[-1][w[, "col"]], w[, "row"])
upats = unique(pats)
data.frame(pat = upats, n = tabulate(match(pats, upats)))
# pat n
#1 A, C 2
#3 A, B 1
#4 A 1
#5 B, C 1