2013-02-12 41 views
1

R,我試圖做的是通過在另一個因子或字符串中「分組」值來創建一個因子。如何基於當前因素創建新因子?

factor1 <- as.factor(c("A","B","C","D")) 

我想什麼是創建一個這樣factor2A & BEC & DF。我試過循環,不能讓它工作,但相信必須有一個優雅的R這樣做。

+0

謝謝阿倫,基於在你的迴應中,我需要更具體,向所有人道歉。我有一個向量(1列×2500行),其內容可以是美國50個州中的任何一個。我想創建一個基於這個向量的因子變量,其中我將4個狀態(稱爲CA,OR,WA,AK)的子集標識爲1並將所有其他標記爲0. – 2013-02-12 21:01:08

+1

是否有任何理由不簡單地添加與您的國旗新列? – 2013-02-12 21:21:48

+1

@RicardoSaporta,是的,這也是我的建議。 – Arun 2013-02-12 21:22:21

回答

1

這是你所期待的嗎?

factor2 <- factor1 
levels(factor2) <- rep(c("E","F"), each=2) 

# [1] E E F F 
# Levels: E F 

使用@迪文的例子,我會做這樣的事情:

set.seed(2) 
sts <- state.abb[sample(50)] 
# your factor1 would be 
factor1 <- factor(sts) 
# you would construct factor2 as 
factor2 <- factor(0 + factor1 %in% c('CA', 'OR', 'WA', 'AK')) 
+0

I Arun,感謝您的協助,我再次修改了我的問題,第一次沒有足夠具體。 – 2013-02-12 21:01:40

+0

@FrankShuster,因子水平將等於向量中唯一元素的數量。所以,我不認爲你可以將二進制級別設置爲具有50個唯一值的向量。爲什麼不創建一個單獨的列,將那些匹配這四個值的值設置爲「1」,其他值設置爲「0」? – Arun 2013-02-12 21:06:00

+0

而@Dinin的編輯會告訴你如何去做。 – Arun 2013-02-12 21:10:42

3
library(car) 
fac2 <- recode(factor1, " c('A', 'B') = 'E'; 
          c('C', 'D') = 'F' ") 
fac2 

# [1] E E F F 
Levels: E F 

注意到,有必要跟蹤2種報價和使用需要的「;」分組子句之間。還有一個'else'參數,?car::recode的幫助頁面將會描述。對於修改後的問題上recode戰略的工作,但也這會成功:

fac2 <- 0 + factor1 %in% c('CA', 'OR', 'WA', 'AK') # numeric result 
fac2 <- factor(fac2) # factor result which displays like a character vector 

注意state.abb是有效的系統恆定的,雖然它是特徵向量,而不是一個因素:

sts <- state.abb[sample(50)] # a scrambled version 
sts[ sts %in% c('CA', 'OR', 'WA', 'AK')] 
#[1] "CA" "AK" "OR" "WA" 

對於使用汽車::重新編碼,這種編碼成功(注意recode返回一個因素,如果給定的一個因素作爲輸入,這點我沒有):

recode(sts, " c('CA', 'OR', 'WA', 'AK') = 1; else=0") 
#------- 
[1] 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 
[45] 0 0 0 0 0 0 
+0

recode看起來像我需要!謝謝。我會重新發布成功。 – 2013-02-12 21:29:35

+0

我希望我能多點贊!感謝這個函數'recode'。一個更有用的功能! – Arun 2013-02-12 22:55:50

+0

這是John Fox的代碼。它曾經是Rhelp的一個常見問題。我只能記得約翰寫的東西。 – 2013-02-12 23:24:10