I have two data frames, one with 1 column (X), and the other with 2 columns (Y & Z):
Column X contains numbers 1:99, but occasionally has some letters instead of numbers, ie: 1, 2, 3, A, 5, B, 7, 8, C, D, 11, 12 etc.
Column Y contains these same letters, which are paired (as appearing in column Z) to certain numbers, ie:
A 4
B 6
C 9
D 10
How can I replace the letters in column X with the values of column Z, according to whether the letters in column X match with the letters in column Y? This would result in column X being 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 etc.
A straightforward merge
won't work (I need to retain all values in X) and I'm not sure how I can use sub
conditionally. Also, column Y and Z contain more rows than needed for column X, so I can't just use cbind
. I'm not very skilled at using regex
, although that is probably my best bet...
Any help would be greatly appreciated!
I'd just use a for loop. Creating your data:
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))
We need to make sure things are character vectors, not factors, for testing equality
df1$X <- as.character(df1$X)
df2$Y <- as.character(df2$Y)
Then we can do the replacing:
for (i in 1:nrow(df2)) {
df1$X[df1$X == df2$Y[i]] <- as.character(df2$Z[i])
}
Finally, I'm guessing you want the X
as numeric now that all the letters are gone:
df1$X <- as.numeric(df1$X)
How about X[X==Y] <- Z[X==Y]
? Or, calling your Y,Z dataframe DF
,
X[X==DF$Y] <- DF$Z[X==DF$Y]
Edit: this is essentially the same as Shuja's answer, but there's no need for a loop so far as I can see.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.