gpt4 book ai didi

r - 将每一行与 data.frame 中的所有其他行进行比较

转载 作者:行者123 更新时间:2023-12-04 01:53:21 26 4
gpt4 key购买 nike

我有一个 tibble,每一行对应一个带有 ID 的样本,每个样本将有多个带有值的类别。我想列出两个或多个类别的值彼此匹配的 ID 对。

# A tibble: 3 x 2
ID data
<chr> <list>
1 ID1 <tibble [1 x 3]>
2 ID2 <tibble [1 x 3]>
3 ID3 <tibble [1 x 3]>

我可以用 sum(match(x$data[[i]], x$data[[j]], nomatch=0)>0)获取两行之间的匹配计数。

我可以通过输入 match() 得到答案里面 ij循环。有没有更好的,即整洁的方式(使用 tidyverse )来获得答案?

谢谢。

例如,这里是原始的 data.frame:
   ID category value
1 ID1 length 100
2 ID1 type L
3 ID1 color Blue
4 ID2 length 100
5 ID2 type M
6 ID2 color Blue
7 ID3 length 150
8 ID3 type M
9 ID3 color Blue

输出将如下所示:
  ID.a ID.b matches
1 ID1 ID2 2
2 ID1 ID3 1
3 ID2 ID3 2

我用过 tidyverse如开头所示,将输入 data.frame 转换为 tibble,然后使用 match在一个循环中。
# A tibble: 3 x 2
ID data
<chr> <list>
1 ID1 <tibble [1 x 3]>
2 ID2 <tibble [1 x 3]>
3 ID3 <tibble [1 x 3]>

最佳答案

这是一个使用 base R 的选项通过使用 tablecrossprod .设置crossprod的矩阵输出的下三角值至 NA , 通过转换为 data.frame 将其转换为 'long' 格式然后 subset 'Freq' 列的非 NA 行

out <- with(df, crossprod(table(paste(category, value), ID)))
out[lower.tri(out, diag = TRUE)] <- NA
subset(as.data.frame.table(out), !is.na(Freq))
# ID ID.1 Freq
#4 ID1 ID2 2
#7 ID1 ID3 1
#8 ID2 ID3 2

数据
df <- structure(list(ID = c("ID1", "ID1", "ID1", "ID2", "ID2", "ID2", 
"ID3", "ID3", "ID3"), category = c("length", "type", "color",
"length", "type", "color", "length", "type", "color"),
value = c("100",
"L", "Blue", "100", "M", "Blue", "150", "M", "Blue")),
class = "data.frame", row.names = c(NA, -9L))

关于r - 将每一行与 data.frame 中的所有其他行进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51950543/

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