我的数据结构如下:
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。我需要代码可以使用无限量的列,每个列都可以识别并遵循相同的模式。
我感谢任何建议和提示! 非常感谢你!
答案 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比较,或者甚至更复杂的检查,请找到你自己的解决方案。