gpt4 book ai didi

r - 计算每个 id 长度为 2 的组合

转载 作者:行者123 更新时间:2023-12-03 03:26:30 25 4
gpt4 key购买 nike

我有一个较大的data.table,有两列,idvar:

head(DT)
# id var
# 1: 1 B
# 2: 1 C
# 3: 1 A
# 4: 1 C
# 5: 2 B
# 6: 2 C

我想创建一种交叉表,它可以显示数据中出现 var 的不同长度 2 组合的次数。

示例数据的预期输出:

out
# A B C
# A 0 3 3
# B NA 1 3
# C NA NA 0

说明:

  • 生成的matrix/data.frame/data.table 的对角线计算id 出现的所有var 全部相同的次数(或者全部A、或B、或C)。在示例数据中,id 4 只有一个条目,即 B,因此 B - B 为 1达到预期的结果。
  • 上三角形计算有多少个 id 两个特定的 var ,即组合 A - B 存在于 3 个 id 中,组合 A - CB - C
  • 请注意,对于任何 id,两个 var 的单个组合只能是 0(不存在)或 1(存在),即我不想要对每个 id 进行多次计数。
  • 结果的下三角形可以为 NA 或 0,或者它可以具有与上三角形相同的值,但这将是多余的。

(只要有相关信息,结果也可以以长格式给出。)

我确信有一种聪明(有效)的计算方法,但我目前无法理解它。

示例数据:

DT <- structure(list(id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L), var = c("B", "C", "A",
"C", "B", "C", "C", "A", "B", "B", "C", "C", "C", "C", "B", "C",
"B", "A", "C", "B")), .Names = c("id", "var"), row.names = c(NA,
-20L), class = "data.frame")

library(data.table)
setDT(DT, key = "id")

最佳答案

既然您可以接受长格式的结果:

DT[, if(all(var == var[1]))
.(var[1], var[1])
else
as.data.table(t(combn(sort(unique(var)), 2))), by = id][
, .N, by = .(V1, V2)]
# V1 V2 N
#1: A B 3
#2: A C 3
#3: B C 3
#4: B B 1

或者如果我们调用上面的输出res:

dcast(res[CJ(c(V1,V2), c(V1,V2), unique = T), on = c('V1', 'V2')][
V1 == V2 & is.na(N), N := 0], V1 ~ V2)
# V1 A B C
#1: A 0 3 3
#2: B NA 1 3
#3: C NA NA 0
<小时/>

combn 的替代方案是:

DT[, if (all(var == var[1]))
.(var[1], var[1])
else
CJ(var, var, unique = T)[V1 < V2], by = id][
, .N, by = .(V1, V2)]
# V1 V2 N
# 1: A B 3
# 2: A C 3
# 3: B C 3
# 4: B B 1

# or combn with list output (instead of matrix)

unique(DT, by=NULL)[ order(var), if(.N==1L)
.(var, var)
else
transpose(combn(var, 2, simplify=FALSE)), by = id][
, .N, by = .(V1, V2)]

关于r - 计算每个 id 长度为 2 的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36941840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com