【发布时间】:2021-06-17 15:11:02
【问题描述】:
1.总结问题
嗨,我对 R 比较陌生,这是我关于堆栈的第一个问题overflow,但我已经从这个网站学习了一段时间。我发现了类似的问题,但它们解释了如何删除 missing values、使用 numerical values 或仅适用于 small number of IDs。
我有一个大型数据框(200 000+ 行),其中一个变量是代表唯一候选者的字母数字 ID,而其他变量代表不同的特征。一些候选项在文件中包含多次,但对于同一特征具有不同的值。我想解决这些差异,以便以后能够删除重复项。数据结构类似这样:
df <- tibble(ID = c("123abc", "123abc", "123abc", "456def", "456def", "789ghi"),
var1 = c("No", "Yes", "No", "No", "No", "No"),
var2 = c("No", "No", "No", "Yes", "No", "No"),
var3 = c("No", "No", "No", "No", "No", "Yes"))
我的目标是首先基于 ID 创建子组,然后在每个 ID 中搜索以查看它们是否具有至少一个值“是”,如果是,则将其所有值更改为“是”。我想对几个变量(var1、var2、var3)重复此操作。这是我想要的结果:
df <- tibble(ID = c("123abc", "123abc", "123abc", "456def", "456def", "789ghi"),
var1 = c("Yes", "Yes", "Yes", "No", "No", "No"),
var2 = c("No", "No", "No", "Yes", "Yes", "No"),
var3 = c("No", "No", "No", "No", "No", "Yes"))
在此之后,我将删除重复的行以仅保留我需要的数据。
df <- distinct(df, across(), .keep_all = TRUE)
2。描述你的尝试
我找到了部分解决方案,但很难将它们组合在一起。我可以使用 dplyr 中的 group_by 按 ID 重新组合我的数据,但我在将其他功能应用于组时遇到问题:
df <- df %>% group_by(ID)
我可以使用if 结合any 将“否”替换为“是”,但如果没有组,它会更改 var1 中的所有值:
if(any(df$var1 == "Yes"))
{ df$var1 = "Yes" }
我尝试创建的解决方案类似于Creating loop for slicing the data, loop through the duplicated positions,使用for 循环ID,然后循环变量,但不替换为随机值。
【问题讨论】:
-
感谢您在发布问题之前阅读提示。我认为这应该适合你:
df %>% group_by(ID) %>% summarise(across(var1:var3, ~ if_else(any(. == "Yes"),"Yes","No")))或者df %>% group_by(ID) %>% mutate(across(var1:var3, ~ if(any(. == "Yes"))rep("Yes",length(.)) else .))
标签: r