gpt4 book ai didi

r - 不寻常的(对我来说)数据结构 : count how often two columns mutually point to one another

转载 作者:行者123 更新时间:2023-12-02 09:06:04 25 4
gpt4 key购买 nike

我正在处理一个数据集,该数据集具有我以前从未使用过的结构。它具有这种格式(最后输入数据的代码):

df
#> Instance Alice_prefers Bob_prefers Charlie_prefers
#> 1 1 Bob Charlie Alice
#> 2 2 Bob Alice Bob
#> 3 3 Bob Charlie Bob

我正在尝试创建一个变量来显示两个人何时“匹配”,即当他们都喜欢对方时,例如,如果 Alice 更喜欢 Bob,而 Bob 也更喜欢 Alice——这是相互匹配:Alice 和 Bob 匹配.

所以我想要的输出是:

output
#> Instance Alice_prefers Bob_prefers Charlie_prefers Match
#> 1 1 Bob Charlie Alice <NA>
#> 2 2 Bob Alice Bob AliceBob
#> 3 3 Bob Charlie Bob BobCharlie

使用 case_when() 似乎可以解决问题,但是有没有比列出每个案例更简单的方法,就像我在下面开始做的那样?在我的真实数据集中,我希望有更多的人,而不仅仅是 Alice、Bob 和 Charlie。

第二个问题:

当我有更多人时,例如。 Alice、Bob、Charlie 和 Denise,Match 列可能包含多个匹配项(例如,Alice 和 Bob 匹配,以及 Charlie 和 Denise 匹配)——对此的整洁解决方案是什么?我是否应该为每个可能的匹配项(例如 AliceBob、AliceCharlie 等)设置一个取值为 1 或 0 的指示变量?

我这样做的原因是:我希望能够快速查看比赛的数量以及比赛中有谁。

#df <- df %>% mutate(Match = ifelse(Alice_prefers=="Bob" & Bob_prefers =="Alice", "AliceBob", NA))
df <- df %>% mutate(
Match = case_when(
(Alice_prefers=="Bob" & Bob_prefers=="Alice") ~ "AliceBob",
(Charlie_prefers=="Bob" & Bob_prefers=="Charlie") ~ "BobCharlie"
)
)
df

数据输入代码:

df <- data.frame(stringsAsFactors=FALSE,
Instance = c(1, 2, 3),
Alice_prefers = c("Bob", "Bob", "Bob"),
Bob_prefers = c("Charlie", "Alice", "Charlie"),
Charlie_prefers = c("Alice", "Bob", "Bob")
)

最佳答案

您遇到图形问题,这通常意味着您应该使用 igraph。您正在寻找有向图中的互边。

我使用 data.table 进行分组,但如果您愿意,也可以使用 tidyverse。

首先,您应该将数据 reshape 为整洁(长)格式。这也是整洁的输出格式。

names(df) <- gsub("_prefers", "", names(df), fixed = TRUE)
library(reshape2)
mdf <- melt(df, id.vars = "Instance")
# Instance variable value
#1 1 Alice Bob
#2 2 Alice Bob
#3 3 Alice Bob
#4 1 Bob Charlie
#5 2 Bob Alice
#6 3 Bob Charlie
#7 1 Charlie Alice
#8 2 Charlie Bob
#9 3 Charlie Bob

library(data.table)
setDT(mdf) #for group-by

library(igraph)
mdf[, Match := {
#turn subsets into graphs
g <- graph_from_data_frame(.SD[, .(variable, value)])
#initialize result
res <- character(.N)
#find reciproc pairs
m <- which_mutual(g)
#I'd probably just return m
#but just for fun,
#get names of reciproc pairs
res[m] <- attr(E(g)[m], "vnames")
res
}, by = Instance]

# Instance variable value Match
#1: 1 Alice Bob
#2: 2 Alice Bob Alice|Bob
#3: 3 Alice Bob
#4: 1 Bob Charlie
#5: 2 Bob Alice Bob|Alice
#6: 3 Bob Charlie Bob|Charlie
#7: 1 Charlie Alice
#8: 2 Charlie Bob
#9: 3 Charlie Bob Charlie|Bob

如果你只想要计数,那就更简单了:

mdf[, .(count = {
#turn subsets into graphs
g <- graph_from_data_frame(.SD[, .(variable, value)])
reciprocity(g) * .N
}), by = Instance]
# Instance count
#1: 1 0
#2: 2 2
#3: 3 2

关于r - 不寻常的(对我来说)数据结构 : count how often two columns mutually point to one another,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58426197/

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