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

标签 r

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/

相关文章:

r - 删除ff包行

r - 在 R 中确定和设置 POSIXct、POSIXlt、strptime 等中的时区

r - 检查 R 中向量的哪些元素位于另一个向量的元素之间

r - 如何将绘图保存为磁盘上的图像?

r - 在bind_rows之后命名数据框中的行

r - `dplyr::percent_rank` 中的错字?

r - 在 R 中拟合三参数对数正态分布

r - 预测拟合插入符号 SVM 模型时的预测警告

r - 聚合最大值和因子

r - 匹配和计算 R 中的字符串