0

我有两个数据框,一个有 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,虽然这可能是我最好的选择......

任何帮助将不胜感激!

4

2 回答 2

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])
}

最后,我猜你想要Xas 数字,因为所有字母都消失了:

df1$X <- as.numeric(df1$X)
于 2012-06-13T11:21:35.633 回答
2

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

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

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

于 2012-06-13T11:22:29.730 回答