2

データ フレームがあり、列の最初の 3 つの値を他の 3 つの値に置き換えたいと考えています。置き換えたい値のリストがあります。

次のリストがあるとします。

Orig  Replacefor
AAA   111
BBB   222
CCC   333
DDD   444
EEE   555

次のデータフレームがあります。

id       amount
AAAXXX   5
BBBXXX   13
CCCXXX   21
DDDXXX   22
EEEXXX   8

次の出力が必要です。

id      amount
111XXX  5
222XXX  13
333XXX  21
444XXX  22
555XXX  8

私の実際の例では、x は任意の値である可能性があり、変更しないでおきたいと思います。

どうもありがとう!

4

2 に答える 2

2

あなたのリストが a という名前Xのデータフレームであり、置き換えられるデータフレームが であると仮定するとDF、これを使用します:

DF <- within(DF, id2 <- paste0(X$Replacefor[match(substr(id,1,3), X$Orig)], substr(id, 4, nchar(as.character(id)))))

編集:テスト済みで動作しています。列が因子であるas.character場合に必要であることに注意してください。id

これにより、データフレームに別の列が作成id2されます。元の列を上書きしたい場合は、2.

于 2013-07-01T02:35:54.730 に答える
0

gsubこれは、ベクター内の特定のパターンを別のパターンに置き換えるために使用するアプローチです。ご不明な点がございましたら、お気軽にお問い合わせください。

# Sample data
df1 <- data.frame(Orig = c("AAA", "BBB", "CCC", "DDD", "EEE"), 
           Replacefor = c(111, 222, 333, 444, 555))

df2 <- data.frame(id = c("AAAXXX", "BBBXXX", "CCCXXX", "DDDXXX", "EEEXXX"), 
           amount = c(5, 13, 21, 22, 8))

# Pattern replacement
df2[, 1] <- sapply(1:nrow(df1), function(i) {
  # Row in df2 that matches pattern from column 1 of df1, e.g. "AAA"
  tmp.row <- grep(df1[i, 1], substr(df2[, 1], 1, 3))
  # Replace pattern with content from column 2 of df1, e.g. "111"
  paste(gsub(df1[i, 1], df1[i, 2], substr(df2[tmp.row, 1], 1, 3)), substr(df2[tmp.row, 1], 4, 6), sep = "")
})

df2 
      id amount
1 111XXX      5
2 222XXX     13
3 333XXX     21
4 444XXX     22
5 555XXX      8
于 2013-07-01T07:41:46.973 に答える