[R] transform dataframe with look-up table

David Carlson dcarlson at tamu.edu
Thu Jul 25 18:04:04 CEST 2013


Here's an approach that seems to work. I added an 11th case to
your data since you did not have a case where both Left and
Right had multiple values in the lookup table. This creates an
id value so that we can merge left and right separately and
then merge them back together:

# Create test data frames
Left <- c(9, 4, 2, 6, 3, 4, 3, 4, 10, 9, 2)
Right <- c(8, 3, 1, 5, 1, 1, 2, 2, 8, 10, 5)
ID <- 1:11
Pair <- data.frame(ID, Left, Right)
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)
Lookup <- data.frame(input, output)
# Merges
Lout <- merge(Pair, Lookup, by.x="Left", by.y="input", 
	all.x=TRUE)[,c("ID", "Left", "output")]
Rout <- merge(Pair, Lookup, by.x="Right", by.y="input", 
	all.x=TRUE)[, c("ID", "Right", "output")]
names(Rout)[3] <- "outputR"
names(Lout)[3] <- "outputL"
merge(Lout, Rout, all=TRUE)[,c(1, 2, 4, 3, 5)]

   ID Left Right outputL outputR
1   1    9     8       7       3
2   2    4     3       2      NA
3   3    2     1       7      NA
4   3    2     1       8      NA
5   4    6     5       5       6
6   4    6     5       5       1
7   5    3     1      NA      NA
8   6    4     1       2      NA
9   7    3     2      NA       7
10  7    3     2      NA       8
11  8    4     2       2       8
12  8    4     2       2       7
13  9   10     8       1       3
14  9   10     8       7       3
15 10    9    10       7       1
16 10    9    10       7       7
17 11    2     5       7       6
18 11    2     5       7       1
19 11    2     5       8       6
20 11    2     5       8       1

-------------------------------------
David L Carlson
Associate Professor of Anthropology
Texas A&M University
College Station, TX 77840-4352

-----Original Message-----
From: r-help-bounces at r-project.org
[mailto:r-help-bounces at r-project.org] On Behalf Of Juan
Antonio Balbuena
Sent: Thursday, July 25, 2013 10:13 AM
To: r-help at r-project.org
Subject: [R] transform dataframe with look-up table


   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 this
   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

   --

   Dr. Juan A. Balbuena
   Marine Zoology Unit
   Cavanilles Institute of Biodiversity and Evolutionary
Biology
   University of
   Valencia
   [1]http://www.uv.es/~balbuena
   P.O. Box 22085
   [2]http://www.uv.es/cavanilles/zoomarin/index.htm
   46071 Valencia, Spain
   [3]http://cetus.uv.es/mullpardb/index.html
   e-mail: [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. http://www.uv.es/%7Ebalbuena
   2. http://www.uv.es/cavanilles/zoomarin/index.htm
   3. http://cetus.uv.es/mullpardb/index.html
   4. mailto:j.a.balbuena at uv.es
______________________________________________
R-help at r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible
code.



More information about the R-help mailing list