gpt4 book ai didi

python - 如何使用 r 计算数据框中一组行的相似程度

转载 作者:行者123 更新时间:2023-11-28 22:52:57 26 4
gpt4 key购买 nike

我有以下数据集:

name    date         cat1    cat2    cat3    cat4    cat5
joe 15/09/2013 A D C D NA
joe 14/09/2013 D A C NA NA
joe 13/09/2013 A C NA NA NA
jack 15/09/2013 G I K D O
jack 14/09/2013 H G O M K

对于每个人,我想计算他们的每个类别相互比较的相似程度的百分比。例如

name    percentage
joe 88.9%
jack 60%

请注意,NA 被忽略,类别出现的次数无关紧要。

向您介绍我的逻辑(这可能是错误的,或者可能有更好的方法,如果是的话请说):让我们以乔为例,

  1. row1 (15/09/2013) compared to row2 (14/09/2013) matches 100%
  2. row1 (15/09/2013) compared to row3 (13/09/2013) matches 66%
  3. row2 (14/09/2013) compared to row3 (13/09/2013) matches 66%
  4. row2 (14/09/2013) compared to row1 (15/09/2013) matches 100%
  5. row3 (13/09/2013) compared to row1 (15/09/2013) matches 100%
  6. row3 (13/09/2013) compared to row2 (14/09/2013) matches 100%

所以平均分是88.9%

对于 jack,只有类别 'G'、'K'、'O' 出现在两行中,因此平均得分为 60%

我研究了 R 中的 ddply 函数,但不确定是否可以使用它来创建上面的数据框(名称、百分比)。我认为我应该避免的其他选择是创建一个带有嵌套 for 循环的 R 脚本,因为我确信在 R 中必须有更有效的方法来做到这一点。

我的最后一个选择,可能是最好的方法(因为这个数据框会非常大)是使用 Python,因此如果有人知道如何做到这一点,那就是 Python(我猜我们将使用 Pandas)我会非常感谢一些帮助。

所以要清楚,两个问题:

  1. 如果可以使用 ddply,有人可以告诉我怎么做吗,还有人对我如何在 r 中解决这个问题有任何其他想法吗?

  2. 有人可以使用上面的小数据框提供一个示例,说明他们将如何在 Python 中解决这个问题吗?

最佳答案

我不明白为什么 row2 vs row3 给出 66%,而 row1 vs row3 给出 100%。我看不到那里的逻辑。

这是我理解的逻辑的实现:

fun <- function(df) {
M <- as.matrix(df)
res1 <- combn(seq_len(nrow(M)), 2, function(ind) {
i <- na.omit(intersect(M[ind[1],], M[ind[2],]))
l <- length(unique(na.omit(M[ind[2],])))
length(i)/l
})
res2 <- combn(rev(seq_len(nrow(M))), 2, function(ind) {
i <- na.omit(intersect(M[ind[1],], M[ind[2],]))
l <- length(unique(na.omit(M[ind[2],])))
length(i)/l
})
c(res1,res2)
}

fun(DF[1:3,3:7])
#[1] 1.0000000 1.0000000 1.0000000 0.6666667 0.6666667 1.0000000

然后我尝试将 ddply 与此函数一起使用,但在惰性求值或范围界定方面存在问题。所以,我转向了 data.table:

library(data.table)
DT <- data.table(DF)
DT[, mean(fun(.SD)), .SDcols=3:7, by=name]
# name V1
#1: joe 0.8888889
#2: jack 0.6000000

我不知道这对您的数据是否足够有效。

关于python - 如何使用 r 计算数据框中一组行的相似程度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19854001/

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