2015-07-20 174 views
0

我有以下的數據幀:轉換連續數據幀轉換成二進制數據幀中的R

i39<-c(5,3,5,4,4,3) 
i38<-c(5,3,5,3,4,1) 
i37<-c(5,3,5,3,4,3) 
i36<-c(5,4,5,5,4,2) 
ndat1<-as.data.frame(cbind(i39,i38,i37,i36)) 
> ndat1 
    i39 i38 i37 i36 
1 5 5 5 5 
2 3 3 3 4 
3 5 5 5 5 
4 4 3 3 5 
5 4 4 4 4 
6 3 1 3 2 

我的目標是要轉換是一個4或5到1的任意值,和其他任何成0至產生以下

> ndat1 
    i39 i38 i37 i36 
1 1 1 1 1 
2 0 0 0 1 
3 1 1 1 1 
4 1 0 0 1 
5 1 1 1 1 
6 0 0 0 0 

回答

4

與您的數據集,我只想做

ndat1[] <- +(ndat1 >= 4) 
# i39 i38 i37 i36 
# 1 1 1 1 1 
# 2 0 0 0 1 
# 3 1 1 1 1 
# 4 1 0 0 1 
# 5 1 1 1 1 
# 6 0 0 0 0 

雖然更廣泛的解決方案將是

ndat1[] <- +(ndat1 == 4 | ndat1 == 5) 
# i39 i38 i37 i36 
# 1 1 1 1 1 
# 2 0 0 0 1 
# 3 1 1 1 1 
# 4 1 0 0 1 
# 5 1 1 1 1 
# 6 0 0 0 0 

一些data.table替代

library(data.table) 
setDT(ndat1)[, names(ndat1) := lapply(.SD, function(x) +(x %in% 4:5))] 

,我會到dplyr傢伙玩得開心mutate_each

+0

此方法將無法正常工作,因爲可能有數據集包含大於4但小於5的情況,並且我只需要恰好4或5的情況。 – costebk08

+0

是的,請參閱編輯。 –

+0

絕對是一個更快捷的解決方案,謝謝!我會盡快投票。但是,我會說這看起來像是產生一個矩陣,我更喜歡數據框。 – costebk08

0

我用下面來解決這個問題:

recode<-function(ndat1){ 
ifelse((as.data.frame(ndat1)==4|as.data.frame(ndat1)==5),1,0) 
} 
sum_dc1<-as.data.frame(sapply(as.data.frame(ndat1),recode),drop=FALSE) 
> sum_dc1 
    i39 i38 i37 i36 
1 1 1 1 1 
2 0 0 0 1 
3 1 1 1 1 
4 1 0 0 1 
5 1 1 1 1 
6 0 0 0 0 

我只是想知道如果任何人其他人有任何想法,但總的來說,我對這種解決問題的方式感到滿意。謝謝。