【问题标题】:Replace missing data depending on values in specific column根据特定列中的值替换缺失数据
【发布时间】:2017-04-23 14:41:43
【问题描述】:

我的数据结构如下:

 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。而且我需要代码为无限数量的列工作,每个列都可以被识别并遵循相同的模式。

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

【问题讨论】:

  • df[(df$X_PersonA==0 & df$X_PersonB==0),1:2]=NA你在找这个吗?
  • Y 变量呢?
  • 如果我将此函数适应我的数据,我会得到以下错误:[<-.data.frame(*tmp*, (df$x_PersonA == 0 & df$x_PersonB == 中的错误:缺失值是不允许在数据帧的下标分配中

标签: r missing-data


【解决方案1】:

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

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 比较,或者更复杂的检查,请自行查找解决方案。

【讨论】:

  • 不,它总是 X_A 与 X_B 检查 - 没有三元外部。非常感谢您的代码,我会尽快尝试(希望明天)。结果看起来就像我想要的那样——太完美了。
猜你喜欢
  • 2021-02-05
  • 2020-11-14
  • 1970-01-01
  • 2019-05-12
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-31
相关资源
最近更新 更多