gpt4 book ai didi

为 R 中的多个变量替换组内的特定 chr 值

转载 作者:行者123 更新时间:2023-12-04 11:50:10 25 4
gpt4 key购买 nike

1.问题总结
嗨,我对 R 比较陌生,这是我关于堆栈 溢出 的第一个问题,但我已经从这个站点学习了一段时间。我发现了类似的问题,但他们解释了如何删除 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 中搜索以查看它们是否至少有一个"is"值,如果是,则将所有值更改为"is"。我想对几个变量(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. 描述你尝试过的东西
我找到了部分解决方案,但我很难把它放在一起。我可以使用 group_by 中的 dplyr 通过 ID 重新分组我的数据,但我在将其他函数应用于组时遇到问题:
df <- df %>% group_by(ID)
我可以使用 ifany 结合使用"is"替换“否”,但如果没有组,它会更改 var1 中的所有值:
if(any(df$var1 == "Yes"))
{ df$var1 = "Yes" }
我尝试创建的解决方案类似于 Creating loop for slicing the data, loop through the duplicated positions ,通过使用 for 循环 ID 然后循环变量,但不替换为随机值。

最佳答案

我已将我的评论提升为一个答案以解释更多。
首先,我们需要决定是使用 dplyr::summarise 还是 dplyr::mutatesummarise 为每个组创建一行,而 mutate 使数据保持相同的维度。
在您的示例数据中,转换后每个组中的所有行都将相同,所以您真的需要重复吗?也许你的真实数据有其他变量,所以 mutate 可能有意义。
从这里开始,我们只需要使用 dplyr::across 对每一列执行相同的操作。第一个参数是选择列,第二个参数是您要应用的函数。
对于 mutate,我们可以使用 dplyr::ifelse 来测试是否有任何变量是 "Yes" 。如果是,我们可以根据该组中的行数重复 "Yes" 多次。否则,我们可以不理会数据。使用 across 数据由 . 表示。

df %>% 
group_by(ID) %>%
mutate(across(var1:var3, ~ ifelse(any(. == "Yes"),rep("Yes",length(.)),.)))
# A tibble: 6 x 4
# Groups: ID [3]
ID var1 var2 var3
<chr> <chr> <chr> <chr>
1 123abc Yes No No
2 123abc Yes No No
3 123abc Yes No No
4 456def No Yes No
5 456def No Yes No
6 789ghi No No Yes

关于为 R 中的多个变量替换组内的特定 chr 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68022037/

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