[R] transform dataframe with look-up table
Juan Antonio Balbuena
j.a.balbuena at uv.es
Fri Jul 26 17:52:58 CEST 2013
Hello
First thank you very much to Jean, Bill, Brian and David for the answers and
code. I very extremely grateful.
I am eventually going to adapt Brian's code with a very minor alteration. If
one follows the original syntax
End <- merge(merge(Start, transformer, by.x="Left", by.y="input",
all.x=TRUE),
transformer, by.x="Right", by.y="input", all.x=TRUE)
the "Left" variables are listed right and vice versa, which seems odd. Just
swapping "Left" and "Right" will put it right (pun intentional):
End <- merge(merge(Start, transformer, by.x="Right", by.y="input",
all.x=TRUE),
transformer, by.x="Left", by.y="input", all.x=TRUE)
Best wishes
Juan Antonio
El 25/07/2013 18:02, Brian Diggs escribió:
On 7/25/2013 8:13 AM, Juan Antonio Balbuena wrote:
Hello
I hope that there is a simple solution to this apparently complex problem.
Any help will be much appreciated:
I have a dataframe with Left and Right readings (that is, elements in each
row are paired). For instance,
Left Right
[1] 9 8
[2] 4 3
[3] 2 1
[4] 6 5
[5] 3 1
[6] 4 1
[7] 3 2
[8] 4 2
[9] 10 8
[10] 9 10
I need to produce a new data frame where the values are transformed
according to a look-up table such as
input output
[1] 5 1
[2] 10 1
[3] 4 2
[4] 8 3
[5] 6 5
[6] 5 6
[7] 7 6
[8] 2 7
[9] 9 7
[10] 10 7
[11] 2 8
So [1, ] in the new dataframe would be 7 3. Quite simple so far, but what
makes things complicated is the multiple outputs for a single input. In thi
s
example, 10 corresponds to 1 and 7 so [9, ] in the input dataframe must
yield two rows in its output counterpart: 1 3 and 7 3. Likewise the output
for [10, ] should be 7 1 and 7 7. In addition, given that 3 and 1 are
missing as inputs the output for [5, ] should be NA NA.
Thank you very much for your time.
Juan Antonio Balbuena
merge can handle both of these requirements.
First, making the two datasets reproducible:
Start <- data.frame(Left=c(9,4,2,6,3,4,3,4,10,9),
Right=c(8,3,1,5,1,1,2,2,8,10))
transformer <- data.frame(input=c(5,10,4,8,6,5,7,2,9,10,2),
output=c(1,1,2,3,5,6,6,7,7,7,8))
Then add a marker of the original row numbers so that the work can be
checked more easily later (not really needed for the calculations):
Start$rownum <- seq_len(nrow(Start))
Two merge statements with the columns specified and all.x set to TRUE
(to keep cases even without a match):
End <- merge(merge(Start, transformer, by.x="Left", by.y="input",
all.x=TRUE),
transformer, by.x="Right", by.y="input", all.x=TRUE)
Then we can look at the output, resorted by the original row numbers:
End[order(End$rownum),]
which gives
Right Left rownum output.x output.y
12 8 9 1 7 3
9 3 4 2 2 NA
1 1 2 3 7 NA
2 1 2 3 8 NA
10 5 6 4 5 6
11 5 6 4 5 1
3 1 3 5 NA NA
4 1 4 6 2 NA
5 2 3 7 NA 7
6 2 3 7 NA 8
7 2 4 8 2 7
8 2 4 8 2 8
13 8 10 9 1 3
14 8 10 9 7 3
15 10 9 10 7 1
16 10 9 10 7 7
--
Dr. Juan A. Balbuena
Marine Zoology Unit
Cavanilles Institute of Biodiversity and Evolutionary Biology
University of
Valencia
[1][1]http://www.uv.es/~balbuena
P.O. Box 22085
[2][2]http://www.uv.es/cavanilles/zoomarin/index.htm
46071 Valencia, Spain
[3][3]http://cetus.uv.es/mullpardb/index.html
e-mail: [[4]4]j.a.balbuena at uv.es tel. +34 963 543 658 fax +34 963 543
733
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
NOTE! For shipments by EXPRESS COURIER use the following street address:
C/ Catedrático José Beltrán 2, 46980 Paterna (Valencia), Spain.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
References
1. [5]http://www.uv.es/%7Ebalbuena
2. [6]http://www.uv.es/cavanilles/zoomarin/index.htm
3. [7]http://cetus.uv.es/mullpardb/index.html
4. [8]mailto:j.a.balbuena at uv.es
--
Dr. Juan A. Balbuena
Marine Zoology Unit
Cavanilles Institute of Biodiversity and Evolutionary Biology
University of
Valencia
[9]http://www.uv.es/~balbuena
P.O. Box 22085
[10]http://www.uv.es/cavanilles/zoomarin/index.htm
46071 Valencia, Spain
[11]http://cetus.uv.es/mullpardb/index.html
e-mail: [12]j.a.balbuena at uv.es tel. +34 963 543 658 fax +34 963 543
733
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
NOTE! For shipments by EXPRESS COURIER use the following street address:
C/ Catedrático José Beltrán 2, 46980 Paterna (Valencia), Spain.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
References
1. http://www.uv.es/~balbuena
2. http://www.uv.es/cavanilles/zoomarin/index.htm
3. http://cetus.uv.es/mullpardb/index.html
4. mailto:4]j.a.balbuena at uv.es
5. http://www.uv.es/%7Ebalbuena
6. http://www.uv.es/cavanilles/zoomarin/index.htm
7. http://cetus.uv.es/mullpardb/index.html
8. mailto:j.a.balbuena at uv.es
9. http://www.uv.es/%7Ebalbuena
10. http://www.uv.es/cavanilles/zoomarin/index.htm
11. http://cetus.uv.es/mullpardb/index.html
12. mailto:j.a.balbuena at uv.es
More information about the R-help
mailing list