2015-07-20 178 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 

我只是想知道如果任何人其他人有任何想法,但总的来说,我对这种解决问题的方式感到满意。谢谢。