根据R中的特定条件替换数据帧的值

时间:2013-07-01 02:07:33

标签: r replace dataframe

我有一个数据框,我想替换其他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可以是任何值,我想保持不变。

非常感谢!

2 个答案:

答案 0 :(得分: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。如果要覆盖rhe原始列,只需删除2

答案 1 :(得分: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