2016-07-14 68 views
-1

假設我有一個數據幀,我想對其執行轉換。 通常它看起來像:使用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(。)]:類型 '內置' 的對象不subsettable
此外:警告消息:
In是。 NA(。):is.na()施加到非類型 '內置'

回答

1

的(列表或向量)我們可以使用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

謝謝,我更喜歡沒有使用其他軟件包的方式。替換功能就是我一直在尋找的功能。 – DaReal

1

一個稍快(在打字方面,如果不知道它的也快在計算方面)比@akrun建議使用來自rec作用方式sjmisc -package:

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 
+0

謝謝,當我有一個更大的替代品列表時,我會記住這一點。 – DaReal