I have two data.frames:
pattern <- data.frame(pattern = c("A", "B", "C", "D"), val = c(1, 1, 2, 2))
match <- data.frame(match = c("A", "C"))
I want to add to my data.frame pattern another column called new_val and assign “X” to each row where the value for column pattern is in the data.frame match otherwise assign “Y”
is.element(pattern$pattern, match$match)
[1] TRUE FALSE TRUE FALSE
So, the resulting data.frame should look like:
pattern val new_val
1 A 1 X
2 B 1 Y
3 C 2 X
4 D 2 Y
I achieved to do it with an ugly for-loop but I am sure this can be pretty much done in a one line R command using fancy stuff 🙂
Is anyone able to help?
Many thanks!
I’m only really posting this since Tyler said “if you wanted a one liner data.table would likely do it” and I knew it was definitely possible with a one liner in base. I am also assuming
matchhad been renamed tomat.pattern$pattern %in% matis finding which of the elements of pattern are in mat which returns TRUE if it’s in mat, FALSE if it’s not. Then I add 1 to make it numeric in the range of 1-2 so that it can be used for indexing. Then we use that as an index to the self defined vectorc("Y", "X")and since the index we created is always 1 or 2 we’re always able to grab an element of interest. So in this case we’ll grab “Y” if pattern wasn’t in mat and “X” if it was – which is what you wanted.