将连续数据帧转换为R中的二进制数据帧

时间:2015-07-20 20:19:14

标签: r dataframe

我有以下数据框:

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

2 个答案:

答案 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

答案 1 :(得分: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

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