【问题标题】:Mutate and replace few columns at once一次变异和替换几列
【发布时间】:2019-02-20 16:14:53
【问题描述】:

我有 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 中的值,具体取决于这些列中的值。例如,如果 task 是 'fre' 而 prevt 是 'rep',那么 task 应该更改为 '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 中不起作用。你能帮我在这种情况下怎么办吗?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    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
    

    【讨论】:

    • 谢谢,我喜欢第二种解决方案。但是,如果我实际上有更多的条件需要同时包含在 mutate 中怎么办?所以,例如不仅 task == "fre" & prevt == "rep",而且 task == "fre" & prevt == "swi" (在第二种情况下,replace 会做其他事情)。
    • 好吧,没关系,解决了 - 我必须在第一次变异中定义我的几个条件,并在第二次变异中进行实际替换。谢谢!
    猜你喜欢
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2013-02-25
    • 1970-01-01
    相关资源
    最近更新 更多