我有隻有變對工作的解決方案,但也許你可以調整這個代碼:
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行只是backtransform的dplyr表回(略顯尷尬)格式你已經顯示。
結果:
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比較,或者更復雜的檢查,請找到你自己的解決方案。
來源
2017-04-23 17:44:46
knb
'df [(df $ X_PersonA == 0&df $ X_PersonB == 0),1:2] = NA'你在找這個嗎? –
「Y」變量呢? – akrun
如果我將這個函數調整到我的數據,我得到了以下錯誤:[< - 。data.frame'('* tmp *',(df $ x_PersonA == 0&df $ x_PersonB ==: 在數據幀的下標賦值中不允許使用值 –