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