2014-10-04 76 views
5

我有一個更大的現有數據框。對於這個較小的例子,我想根據列「first」來替換一些變量(用state替換(df1))和newstate(df2)。我的問題是值作爲NA返回,因爲只有一些名稱在新數據框(df2)中匹配。具有不匹配的返回值原樣使用R中的匹配函數

現有數據幀:

state = c("CA","WA","OR","AZ") 
first = c("Jim","Mick","Paul","Ron") 
df1 <- data.frame(first, state) 

     first state 
    1 Jim CA 
    2 Mick WA 
    3 Paul OR 
    4 Ron AZ 

新數據幀以匹配現有數據幀

state = c("CA","WA") 
newstate = c("TX", "LA") 
first =c("Jim","Mick") 
df2 <- data.frame(first, state, newstate) 

    first state newstate 
1 Jim CA  TX 
2 Mick WA  LA 

試圖使用匹配但返回NA爲「狀態」,其中匹配的「第一」從DF2變量不在原始數據框中找到。

df1$state <- df2$newstate[match(df1$first, df2$first)] 

    first state 
1 Jim TX 
2 Mick LA 
3 Paul <NA> 
4 Ron <NA> 

有沒有辦法忽略不匹配或不匹配返回現有的變量?這將是預期結果的例子:吉姆/米克的狀態會更新,而保羅和羅恩的狀態不會改變。

 first state 
    1 Jim TX 
    2 Mick LA 
    3 Paul OR 
    4 Ron AZ 

回答

6

這是你想要的;順便說一句,除非你真的想處理因素,請在data.frame調用中使用stringsAsFactors = FALSE。注意在匹配調用中使用nomatch = 0。

> state = c("CA","WA","OR","AZ") 
> first = c("Jim","Mick","Paul","Ron") 
> df1 <- data.frame(first, state, stringsAsFactors = FALSE) 
> state = c("CA","WA") 
> newstate = c("TX", "LA") 
> first =c("Jim","Mick") 
> df2 <- data.frame(first, state, newstate, stringsAsFactors = FALSE) 
> df1 
    first state 
1 Jim CA 
2 Mick WA 
3 Paul OR 
4 Ron AZ 
> df2 
    first state newstate 
1 Jim CA  TX 
2 Mick WA  LA 
> 
> # create an index for the matches 
> indx <- match(df1$first, df2$first, nomatch = 0) 
> df1$state[indx != 0] <- df2$newstate[indx] 
> df1 
    first state 
1 Jim TX 
2 Mick LA 
3 Paul OR 
4 Ron AZ 
+0

您的代碼有效[謝謝]但是,您能解釋爲什麼您在equals和indx的左邊有'indx!= 0' ''df1 $ state [indx!= 0] < - df2 $ newstate [indx]' – 2016-10-05 11:34:25

2
library(data.table) 
DT1 <- as.data.table(df1) 
DT2 <- as.data.table(df2) 


setkey(DT1, first, state) 
setkey(DT2, first, state) 

DT1[DT2] 
# first state newstate 
# 1: Jim CA  TX 
# 2: Mick WA  LA 

注意[.data.table也有nomatch的說法,即:

DT2[DT1, nomatch=0] 
# first state newstate 
# 1: Jim CA  TX 
# 2: Mick WA  LA 

DT2[DT1, nomatch=NA] 
# first state newstate 
# 1: Jim CA  TX 
# 2: Mick WA  LA 
# 3: Paul OR  NA 
# 4: Ron AZ  NA 

3

我認爲你會得到與特徵向量更好的行爲比因素。

> df1 <- data.frame(first, state,stringsAsFactors=FALSE) 
> state = c("CA","WA") 
> newstate = c("TX", "LA") 
> first =c("Jim","Mick") 
> df2 <- data.frame(first, state, newstate, stringsAsFactors=FALSE) 
> df1[ match(df2$first, df1$first), "state"] <- df2$newstate 
> df1 
    first state 
1 Jim TX 
2 Mick LA 
3 Paul OR 
4 Ron AZ 
+0

我能夠重現您的答案。然後我用str()將我的原始數據轉換爲字符和格式。它們在結構上似乎是相同的。當我嘗試我在我的大的原始數據集上嘗試它時,我得到: 「[<。data.frame'('* tmp *',match(df2 $ first,df1 $ first) : 數據框的下標賦值中不允許缺少值「 – panstotts 2014-10-04 07:23:25