Если значения в диапазоне столбцов отсутствуют в другом столбце, заменить на NA - PullRequest
1 голос
/ 11 октября 2019

У меня есть набор данных, который включает в себя некоторые не связанные данные, которые я хотел бы заменить на NA. В следующем примере, если данные в столбцах с rep1 по rep4 не соответствуют одному из значений в столбце ID, я хотел бы заменить это значение на NA. В этом случае значения x, y и z не указаны в столбце идентификатора, поэтому их следует заменить.

Это несколько схожий вопрос, который я задал здесь ранее: Если данные присутствуют, замените их данными из другого столбца на основе идентификатора строки

Я думаю, что решение будетпохоже на то, что было дано в предыдущем вопросе, но я не знаю, как изменить вторую часть ~ value[match(., ID)], чтобы вернуть NA для значений, которые не перечислены в столбце ID.

df %>% mutate_at(vars(rep1:rep4), ~ value[match(., ID)])

ID  rep1  rep2  rep3  rep4  
a                           
b   a                       
c   a     b                 
d   a     b     c           
e   a     b     c     d     
f                           
g   x                       
h                           
i                           
j   y     z                 
k   z                       
l                           
m                           

Результат должен выглядеть следующим образом:

ID  rep1  rep2  rep3  rep4  
a                           
b   a                       
c   a     b                 
d   a     b     c           
e   a     b     c     d     
f                           
g   NA                      
h                           
i                           
j   NA    NA                    
k   NA                      
l                           
m                           

Вот данные с использованием dput()

structure(list(ID = structure(1:13, .Label = c("a", "b", "c", 
"d", "e", "f", "g", "h", "i", "j", "k", "l", "m"), class = "factor"), 
    rep1 = structure(c(1L, 2L, 2L, 2L, 2L, 1L, 3L, 1L, 1L, 4L, 
    5L, 1L, 1L), .Label = c("", "a", "x", "y", "z"), class = "factor"), 
    rep2 = structure(c(1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 3L, 
    1L, 1L, 1L), .Label = c("", "b", "z"), class = "factor"), 
    rep3 = structure(c(1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L), .Label = c("", "c"), class = "factor"), rep4 = structure(c(1L, 
    1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", 
    "d"), class = "factor")), class = "data.frame", row.names = c(NA, -13L))

Ответы [ 2 ]

3 голосов
/ 11 октября 2019

Альтернатива dplyr с использованием replace()

df %>%
  mutate_at(vars(rep1:rep4), ~replace(., which(!(. %in% ID | . == "")), NA))

   ID rep1 rep2 rep3 rep4
1   a                    
2   b    a               
3   c    a    b          
4   d    a    b    c     
5   e    a    b    c    d
6   f                    
7   g <NA>               
8   h                    
9   i                    
10  j <NA> <NA>          
11  k <NA>               
12  l                    
13  m 

2 голосов
/ 11 октября 2019

Мы можем использовать sapply и заменить значения на NA, если они отсутствуют в ID или имеют пустое значение.

df[!(sapply(df, `%in%`, df$ID) | df == '')] <- NA
df

#   ID rep1 rep2 rep3 rep4
#1   a                    
#2   b    a               
#3   c    a    b          
#4   d    a    b    c     
#5   e    a    b    c    d
#6   f                    
#7   g <NA>               
#8   h                    
#9   i                    
#10  j <NA> <NA>          
#11  k <NA>               
#12  l                    
#13  m                   
...