2

我有一个数据框,我想将一列的前三个值替换为其他 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

假设您的列表是一个名为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 回答