10

私ははるかに大きな既存のデータフレームを持っています。この小さな例では、列「最初」に従って、いくつかの変数 (状態 (df1) を置き換える) を新しい状態 (df2) に置き換えたいと思います。私の問題は、名前の一部のみが新しいデータフレーム (df2) で一致するため、値が NA として返されることです。

既存のデータフレーム:

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

一致を使用しようとしましたが、df2 からの一致する「最初の」変数が元のデータフレームに見つからない「状態」に対して NA を返します。

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

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

nomatch を無視する方法、または nomatch で既存の変数をそのまま返す方法はありますか? これは望ましい結果の例です。ジム/ミックの状態は更新されますが、ポールとロンの状態は変化しません。

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

3 に答える 3

9

これは、あなたの望むことですか; ところで、本当に因子を操作したい場合を除き、data.frame 呼び出しで stringsAsFactors = FALSE を使用してください。match 呼び出しで 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
于 2014-10-04T23:08:37.303 に答える
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
于 2014-10-04T04:14:36.750 に答える
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

于 2014-10-04T03:23:41.737 に答える