使用Y列中的值替换X列中的值,但前提是X的值与Z列中的值匹配

时间:2012-06-13 11:07:01

标签: r

我有两个数据框,一个有1列(X),另一个有2列(Y& Z):

列X包含数字1:99,但偶尔会有一些字母而不是数字,即:1, 2, 3, A, 5, B, 7, 8, C, D, 11, 12 etc.

Y列包含这些相同的字母,这些字母与某些数字配对(如Z列所示),即:

A 4

B 6

C 9

D 10

如何根据X列中的字母是否与Y列中的字母匹配,如何将列X中的字母替换为Z列的值?这将导致列X为1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 etc.

直截了当的merge无效(我需要保留X中的所有值),我不确定如何有条件地使用sub。此外,列Y和Z包含的行数多于列X所需的行数,因此我不能只使用cbind。我不是很熟练使用regex,虽然这可能是我最好的选择......

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

我只是使用for循环。创建数据:

df1 <- data.frame(X = c("A", 5, "B", 7, 8, "C", "D", 11, 12))
df2 <- data.frame(Y = c("A", "B", "C", "D"),
                  Z = c(4, 6, 9, 10))

我们需要确保事物是用于测试平等的特征向量而不是因素

df1$X <- as.character(df1$X)
df2$Y <- as.character(df2$Y)

然后我们可以做替换:

for (i in 1:nrow(df2)) {
    df1$X[df1$X == df2$Y[i]] <- as.character(df2$Z[i])
}

最后,我猜你希望X为数字,因为所有字母都消失了:

df1$X <- as.numeric(df1$X)

答案 1 :(得分:1)

X[X==Y] <- Z[X==Y]怎么样?或者,调用您的Y,Z数据帧DF

X[X==DF$Y] <- DF$Z[X==DF$Y]

编辑:这与Shuja的答案基本相同,但就我所见,我不需要循环。