2014-11-24 153 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