r语言 - 在每行中搜索重复项并返回哪一列有重复项?



所以我有民意调查数据,我正在看,我一直试图在R中创建一个脚本。第一栏是选民的姓名。其余的栏是他们投票给不同类别的人的名字。我有70个投票人,所以我有70排。我想看看有没有人为自己投票。因此,我试图检查行内的任何重复,即行第一个单元格的任何重复(即选民自己的名字)。我最初使用x[duplicate (x)]函数,它工作得很好,因为它显示了行中哪些值是重复的。但是我没能让for循环运行。所以我必须一个接一个地做。任何建议吗?我应该选择第一个单元格中的值并在行其余部分中搜索该值吗?我怎样才能让它让我知道,如果值是重复的,它出现在哪个列?最终,我将需要这些信息,以便我可以删除自我投票。感谢所有!

编辑:这里是示例数据帧。

voter_name <- c("John Smith", "Jane Doe", "John Doe", "Beyonce")
poll1 <- c("Spiderman", "The Hulk", "Superman", "Batman")
poll2 <- c("Red", "", "Purple", "Yellow")
poll3 <- c("Georgia", "", "Alaska", "Michigan")
poll4 <- c("John Smith", "John Doe", "Beyonce", "Jane Doe")
df <- data.frame(voter_name, poll1, poll2, poll3, poll4)

如果我使用重复的函数,它会搜索第一行,并让我知道John Smith在上次投票中为自己投票,这正是我想要的:

RowVector = as.character(df[1, ])
RowVector[duplicated(RowVector)]

不幸的是,它也将NA和空白标记为重复,所以它还告诉我Jane Doe有2个空的民意调查,我不关心。理想情况下,我可以让它忽略这些。但我的主要问题是如何通过所有4行运行这段代码,而无需手动输入。而且我只关心投票人的姓名(列1)是否重复,所以实际上我不想看到其他重复的内容。再次感谢! !

一种选择是基于voter_name在所有列上创建一个逻辑,然后我们可以提取所有具有相同名称的列名。

library(tidyverse)
df %>%
mutate(across(-voter_name, ~ voter_name == .x),
self_vote = pmap_chr(across(where(is.logical)), ~ toString(names(c(...))[which(c(...))]))) %>%
select(voter_name, self_vote)

voter_name self_vote
1 John Smith     poll4
2   Jane Doe          
3   John Doe          
4    Beyonce          

或者使用dplyr和base R的组合的另一个选项:

library(dplyr)
result <- mutate(df, across(-voter_name, ~ voter_name == .x))
result$self_vote <- apply(result, 1, function(x) names(which(x == T)))
result <- result[,c("voter_name", "self_vote")]

最新更新