2014-11-24 147 views
0

的数据集(DF)具有> 600个观察和100个变量中,我有多个特性的变量在一个字符串象在以下的形式:二进制变量变量

df$a 
    a 
1 aa 
2 bb 
3 aa 
4 cc 
5 bb 
6 dd 
7 cc 
8 dd 

现在,我想计算出的a,所有"aa""bb"得到值0和一个新的二元变量所有"cc""dd"获得价值1。我希望这样的事情:

a b 
1 aa 0 
2 bb 0 
3 aa 0 
4 cc 1 
5 bb 0 
6 dd 1 
7 cc 1 
8 dd 1 

我会怎么做呢?

非常感谢您预先的任何形式的帮助。

马格努斯

+1

也许'有(DF,ifelse(一%的%C( “AA”, “BB”),0,1))' – 2014-11-24 19:44:42

+0

你能想出很多方法可以做到这一点,但-perhaps - 一种“正式”的方式会操纵R的“因素”类?即,在这里使用''levels < - “'函数; '水平(DF $ A)=列表( “0”= C( “AA”, “BB”), “1”= C( “CC”, “DD”))' – 2014-11-24 20:09:41

+0

@RichardScriven虽然MWE工作正常,如果我使用'NewVariable < - with(df,ifelse(OldVariable%in%c(“first value”,“second value”,“third value”),0,1))的真实数据集中的方法,新变量保存只值1的所有观测值,也为那些应为0。我不知道为什么。 – 2014-11-24 20:28:26

回答

3

通用解决方案:构建密钥(或“字典”)。

> key <- c("aa" = 0, "bb" = 0, "cc" = 1, "dd" = 1) 
> key[a] 
aa bb aa cc bb dd cc dd 
0 0 0 1 0 1 1 1 
+0

谢谢。 '新变量< - 键[a]'。 – 2014-11-24 20:41:40

+0

一个注释:向量(包括列表)的名称在R中不必是唯一的。因此,如果要以编程方式构建字典,请注意检查重复键。还要注意矢量的名称不是散列的,所以它不是O(1)查找,它是O(n),其中n是键的数量。 – mmuurr 2014-11-24 22:08:10

0

我会子集使用逻辑测试和运行是这样的:

a <- c("aa", "bb", "aa", "cc", "bb", "dd", "cc", "dd") 
a[a == "aa"] <- 0 
a[a == "bb"] <- 0 
a[a == "cc"] <- 1 
a[a == "dd"] <- 1 
a <- data.frame(a) 
a 
0

的方法有很多,其中之一是使用重新编码从包汽车

dat1 <- data.frame(a=c("aa", "bb", "aa", "cc", "bb", "dd", "cc", "dd")) 
dat2 <- transform(dat1, b=car::recode(a,"c('aa','bb')=0;c('cc','dd')=1;else=NA",as.factor.result=FALSE)) 

> dat2 
    a b 
1 aa 0 
2 bb 0 
3 aa 0 
4 cc 1 
5 bb 0 
6 dd 1 
7 cc 1 
8 dd 1 
+0

这种解决方案意味着我会生成新的数据集,对不对?我想重新编码到现有数据集中的新变量。 – 2014-11-24 20:23:25