【问题标题】:Conditionally replace values using magrittr使用 magrittr 有条件地替换值
【发布时间】:2016-11-17 05:06:25
【问题描述】:

假设我有一个要对其执行转换的数据框。 通常它看起来像:

a <- data.frame(c(NA, 0,1), c(34,NA,0), c(3,9,NA) )
b <- c('key1', 'key2', 'key3')
####replace NA values with 0
a[is.na(a)] <- 0
####replace 1 with 2
a[a==1] <- 2
####sum rows
a <- rowSums(a)
####bind b as key column for joining datasets in a later stage
c <- cbind(b, a)

现在我的问题是:如何将其翻译成magrittr

library(magrittr)
c %>% 
.[is.na] %>% 0 %>% .[.==1] %>% 2 %>%
rowSums %>% cbind(b, .)

给我:

.[is.na(.)] 中的错误:“内置”类型的对象不是子集
另外:警告信息:
在 is.na(.) 中:is.na() 应用于“内置”类型的非(列表或向量)

【问题讨论】:

    标签: r replace conditional magrittr


    【解决方案1】:

    使用sjmisc-package 中的rec 函数比@akrun 建议的方法稍快(在打字方面,不确定在计算方面是否也更快):

    library(sjmisc)
    library(dplyr)
    
    a <- data.frame(c(NA, 0,1), c(34,NA,0), c(3,9,NA) )
    b <- c('key1', 'key2', 'key3')
    
    a %>% 
      rec("NA=0;1=2;else=copy") %>% 
      rowSums(.) %>% 
      data_frame(key = b, val = .)
    
    # A tibble: 3 x 2
    #     key   val
    #   <chr> <dbl>
    # 1  key1    37
    # 2  key2     9
    # 3  key3     2
    

    【讨论】:

    • 谢谢,当我有更多的替换清单时,我会记住这一点。
    【解决方案2】:

    我们可以使用dplyr

    library(dplyr)
    a %>%
        mutate_each(funs(replace(., is.na(.), 0))) %>% 
        mutate_each(funs(replace(., .==1, 2))) %>%
        rowSums(.) %>%
        data_frame(key = b, val = .)
    #    key   val
    #   <chr> <dbl>
    #1  key1    37
    #2  key2     9
    #3  key3     2
    

    或者不使用dplyr 函数

     a %>% 
        is.na(.) %>%
        replace(a, ., 0) %>%
        replace(., .==1, 2) %>%
        rowSums() %>% 
        cbind(b, .)
    

    【讨论】:

    • 谢谢,我更喜欢不使用其他软件包的方式。替换功能是我一直在寻找的。​​span>
    猜你喜欢
    • 2014-08-23
    • 2021-10-15
    • 2016-06-07
    • 2012-01-03
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2018-08-28
    相关资源
    最近更新 更多