2014-02-16 57 views
3

假設我有以下列表,其中「名稱」爲名稱的完整列表的性別匹配名稱列表,並填充一個新的變量(比如說,在一個類):循環可根據姓名

names<-as.matrix(c("Paul", "Tyler", "Roberta", "Greg", "Tiffany")) 

假設我有名字的次列表,這一個只包括「女性」的名字:

female_names<-as.matrix(c("Roberta", "Tiffany", "Michelle", "Ashley")) 

我試圖創建另一個變量,「婦女」,即取值1,如果元素「名稱「與上面第二個列表中的」女性名字「之一匹配。

women<-as.matrix(rep(0, 5)) 

for(i in 1:nrow(names)){ 
    for(j in 1:nrow(female_names)){ 
    if(names[i,1]==female_names[j,1]){women[i]<-1} 
    } 
} 

然而,當我總結了新的變量女人,所有的值都爲0,這不應該是這樣。

summary(women) 

不過,我的問題是,沒有一個女性的名字被正確識別和接收的1新女性變量的相應值。 如何正確執行此循環以匹配名稱並相應地填充我的新變量?

+1

雖然我會建議阿難的答案,你的邏輯對我來說確實很好。我在第三和第五行得到一個1的列矩陣。你會發生什麼? – BrodieG

+0

@BrodieG,閱讀其餘的問題,或許是他們*可能*正在尋找'表(女性[,1])'而不是'彙總'... – A5C1D2H2I1M1N2O1R2T1

+0

@BrodieG 所有我在我的結果是0,這不應該是這樣的,如果我的條件語句在循環中實際制定正確。很奇怪,你從上面的例子代碼得到了正確的結果,因爲循環既不適用於上面的例子,也不適用於我的實際數據。 我一般都同意接受Ananda的回答,但對於上述一般方法爲什麼不能正確執行,我仍然感到困惑。 –

回答

4

你應該只使用%in%

> names[, 1] %in% female_names[, 1] 
[1] FALSE FALSE TRUE FALSE TRUE 

你可以用整個事情在as.numeric,如果你喜歡的1和0,而不是TRUEFALSE

> as.numeric(names[, 1] %in% female_names[, 1]) 
[1] 0 0 1 0 1 
1

不完全的答案到你問的問題,但也許這是一個更好的答案。

qdap dev的版本有名字給可能感興趣的性功能(name2sex):

names<-c("Paul", "Tyler", "Roberta", "Greg", "Tiffany") 
name2sex(names) 

## > name2sex(names) 
## [1] M M F M F 

## OR.... 

name2sex(names, USE.NAMES=TRUE) 

## > name2sex(names, USE.NAMES=TRUE) 
## Paul Tyler Roberta Greg Tiffany 
##  M  M  F  M  F 

而得到的數值:

## 2 - as.numeric(name2sex(names)) 

## > 2 -as.numeric(name2sex(names)) 
## [1] 0 0 1 0 1 
+0

+1。我記不起那個功能在哪裏。當我正在瀏覽Git Hub上的一些代碼時,一定是這樣。 – A5C1D2H2I1M1N2O1R2T1

+0

@Tyler Rinker可以使用其他語言的名稱來執行此功能嗎?特殊字符等? –

+0

如果你使用'?name2sex',你會看到描述中說'預測美國名字中的性別(根據1990年美國人口普查數據)「。 –