我有两个数据框,一个有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
,虽然这可能是我最好的选择......
非常感谢任何帮助!
答案 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的答案基本相同,但就我所见,我不需要循环。