根据特定列中的值替换缺少的数据

时间:2017-04-23 14:41:44

标签: r missing-data

我的数据结构如下:

 X_PersonA  X_PersonB   Y_PersonA   Y_PersonB
 0          0           5           7
 0          5           3           0
 5          7           8           0
 0          0           1           2
 0          3           1           0
 9          0           0           0
 8          3           4           6

我有一个数据框,其中包含两个不同的人一起工作的X和Y的不定变量。我现在需要用以下逻辑替换一些零: X_PersonA = 0 AND X_PersonB = 0 -> both 0 = NA X_Person A = 0 AND X_Person B ≠ 0 -> 0 stays 0 X_Person A ≠ 0 AND X_Person B = 0 -> 0 stays 0

更准确地说,如果相关列也包含0,则0仅计为NA。我需要代码可以使用无限量的列,每个列都可以识别并遵循相同的模式。

我感谢任何建议和提示! 非常感谢你!

1 个答案:

答案 0 :(得分:0)

我有一个仅适用于变量对的解决方案,但也许您可以调整此代码:

library(tidyr)
library(dplyr)
dat <- read.table(header=TRUE, text =  "X_PersonA  X_PersonB   Y_PersonA   Y_PersonB
 0          0           5           7
 0          5           3           0
 5          7           8           0
 0          0           1           2
 0          3           1           0
 9          0           0           0
 8          3           4           6")

dat %>% 
        mutate(id = row_number()) %>%
        gather(key, value, -id) %>%
        separate(key, c("prefix", "person"), sep = "_") %>%
        spread(person, value) %>%
        arrange(id, prefix) %>%
        mutate_each(funs(ifelse(PersonA == 0 & PersonB == 0, NA, .)), -id, -prefix)  %>%
        gather(key, value, -id, -prefix) %>%
        mutate(origcol = sprintf("%s_%s", prefix, key)) %>%
        select(id, origcol, value) %>%
        spread(origcol, value) %>%
        select(-id)

最后5行只是将dplyr-table转换回你所显示的(略显笨拙)格式。

结果:

  X_PersonA X_PersonB Y_PersonA Y_PersonB
1        NA        NA         5         7
2         0         5         3         0
3         5         7         8         0
4        NA        NA         1         2
5         0         3         1         0
6         9         0        NA        NA
7         8         3         4         6

对于每个新对X_PersonC - Y_PersonD,您可以添加新的mutate_each()行(未经测试)。你有几双?

如果你必须执行三元 X_PersonA - Y_PersonB - Z_Person_C比较,或者甚至更复杂的检查,请找到你自己的解决方案。