2017-04-23 73 views
0

我有結構化的數據如下:更換取決於值在特定列缺失數據

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。而我需要的代碼工作對於無限數量的列可以分別標識並遵循相同的模式。

我很欣賞任何建議和提示! 非常感謝!

+0

'df [(df $ X_PersonA == 0&df $ X_PersonB == 0),1:2] = NA'你在找這個嗎? –

+0

「Y」變量呢? – akrun

+0

如果我將這個函數調整到我的數據,我得到了以下錯誤:[< - 。data.frame'('* tmp *',(df $ x_PersonA == 0&df $ x_PersonB ==: 在數據幀的下標賦值中不允許使用值 –

回答

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行只是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比較,或者更復雜的檢查,請找到你自己的解決方案。

+0

不,它總是X_A與X_B檢查 - 沒有三元擴展。非常感謝您的代碼,我會盡快嘗試(希望明天)。只是我想要的 - 這是完美的。 –