Мутировать и заменить несколько столбцов одновременно - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть df, например:

  outc  task  prevt 
  <fct> <fct> <fct> 
1 los   fre   rep   
2 los   fre   swi   
3 los   ins   rep   
4 los   ins   swi   
5 win   fre   rep   
6 win   fre   swi   
7 win   ins   rep   
8 win   ins   swi   

Я хочу заменить значения в столбце task и prevt, в зависимости от значения в каждом из этих столбцов.Например, если задача «fre», а prevt - «rep», то задача должна быть изменена на «ins», а prev - «swi».Главное, что мне нужно изменить все сразу, как будто я делаю это один за другим, тогда результат будет отличаться от того, что я хочу.Таким образом, казалось, что задание легко изменить с помощью mutate и replace:

df %>% 
  mutate(task = replace(task, task == 'fre' & prevt == 'rep', 'ins'),
         prevt = replace(prevt, task == 'fre' & prevt == 'rep', 'swi')) 

Но по какой-то причине в этом случае работает только первая часть mutate, то есть столбец задачи изменяется, а столбец prevt - нет.

  outc  task  prevt
  <fct> <fct> <fct>
1 los   ins   rep  
2 los   fre   swi  
3 los   ins   rep  
4 los   ins   swi  
5 win   ins   rep  
6 win   fre   swi  
7 win   ins   rep  
8 win   ins   swi  

Если я изменю вторую часть на какое-то безусловное значение (например, prevt = '1'), то это сработает.

df %>% 
  mutate(task = replace(task, which(task == 'fre' & prevt == 'rep'), 'ins'),
         prevt = '1')

  outc  task  prevt
  <fct> <fct> <chr>
1 los   ins   1    
2 los   fre   1    
3 los   ins   1    
4 los   ins   1    
5 win   ins   1    
6 win   fre   1    
7 win   ins   1    
8 win   ins   1   

Так что по какой-то причине замена двух не работает в mutate.Не могли бы вы помочь мне, что я мог сделать в этом случае?

1 Ответ

0 голосов
/ 20 февраля 2019
Опция

A base R будет состоять в том, чтобы сначала создать объект с логическим условием (чтобы оно не изменилось позже), а затем использовать Map для замены столбцов соответствующими значениями

i1 <- with(df, task == "fre" & prevt == "rep")
df[-1] <- Map(function(x, i) replace(x, i1, i),  df[-1], c("ins", "swi"))

Или, следуя той же логике в коде OP, сначала создайте логическое условие, а затем используйте это

library(dplyr)
df %>% 
     mutate(i1 = task == "fre" & prevt == "rep", # create logical column 
            task = replace(task, i1, "ins"), 
            prevt = replace(prevt, i1, "swi")) %>% 
     select(-i1) # remove the logical column
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...