使用magrittr有条件地替换值

时间:2016-07-14 10:15:55

标签: r replace conditional magrittr

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

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(。)]:类型&#39;内置&#39;不是子集表   另外:警告信息:
  在is.na(。)中:is.na()应用于类型&#39;内置&#39;的非(列表或向量)。

2 个答案:

答案 0 :(得分: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, .)

答案 1 :(得分:1)

稍微快一点(就打字而言,不确定它在计算方面是否也更快)方式比@akrun所建议的那样使用sjmisc包中的rec函数:

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