如何按指定行对分组填充DataFrame中的NA值?
解决方案
方法一:修正分组逻辑后用group_by+fill(推荐)
你之前的问题出在分组依据不对,label是每个well单独的标识,没法把关联行对归到一组。我们可以先根据label里的数字生成分组ID,把关联行对分到同一组后再用fill填充NA:
library(dplyr) # 如果不想额外加载stringr包,用substr提取数字 pbs_in_v2_cleaned <- pbs_in_v2 %>% # 生成分组ID:well_1&2为组1,well_3&4为组2,well_5&6为组3,well_7单独为组4 mutate(group_id = (as.integer(substr(label, 6, nchar(label))) + 1) %/% 2) %>% # 按分组ID聚合,双向填充组内的NA值 group_by(group_id) %>% fill(everything(), .direction = "downup") %>% ungroup() %>% # 可选:删除临时生成的分组列 select(-group_id)
如果习惯用stringr提取数字,也可以把提取数字的部分换成:
mutate(group_id = (as.integer(stringr::str_extract(label, "\\d+")) + 1) %/% 2)
这样处理后,well_2的WT_group_4会被well_1的2670填充,well_5的WT_group_3会被well_4的2832填充,well_7保持原样不变。
方法二:用if_else手动指定填充规则(适合行对少的场景)
如果你的关联行对数量不多,也可以直接用if_else针对性替换NA:
pbs_in_v2_cleaned <- pbs_in_v2 %>% # 替换well_2的WT_group_4的NA mutate(WT_group_4 = if_else(label == "well_2" & is.na(WT_group_4), WT_group_4[label == "well_1"], WT_group_4)) %>% # 替换well_5的WT_group_3的NA mutate(WT_group_3 = if_else(label == "well_5" & is.na(WT_group_3), WT_group_3[label == "well_4"], WT_group_3))
这种方法需要逐个指定要替换的位置,行对多的时候效率较低,更推荐第一种方法。
内容的提问来源于stack exchange,提问作者Someone_1313
相关产品推荐
相关产品推荐

