在R
,我試圖做的是通過在另一個因子或字符串中「分組」值來創建一個因子。如何基於當前因素創建新因子?
factor1 <- as.factor(c("A","B","C","D"))
我想什麼是創建一個這樣factor2
A
& B
是E
和C
& D
是F
。我試過循環,不能讓它工作,但相信必須有一個優雅的R
這樣做。
在R
,我試圖做的是通過在另一個因子或字符串中「分組」值來創建一個因子。如何基於當前因素創建新因子?
factor1 <- as.factor(c("A","B","C","D"))
我想什麼是創建一個這樣factor2
A
& B
是E
和C
& D
是F
。我試過循環,不能讓它工作,但相信必須有一個優雅的R
這樣做。
這是你所期待的嗎?
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'))
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
recode看起來像我需要!謝謝。我會重新發布成功。 – 2013-02-12 21:29:35
我希望我能多點贊!感謝這個函數'recode'。一個更有用的功能! – Arun 2013-02-12 22:55:50
這是John Fox的代碼。它曾經是Rhelp的一個常見問題。我只能記得約翰寫的東西。 – 2013-02-12 23:24:10
謝謝阿倫,基於在你的迴應中,我需要更具體,向所有人道歉。我有一個向量(1列×2500行),其內容可以是美國50個州中的任何一個。我想創建一個基於這個向量的因子變量,其中我將4個狀態(稱爲CA,OR,WA,AK)的子集標識爲1並將所有其他標記爲0. – 2013-02-12 21:01:08
是否有任何理由不簡單地添加與您的國旗新列? – 2013-02-12 21:21:48
@RicardoSaporta,是的,這也是我的建議。 – Arun 2013-02-12 21:22:21