[R] Joining two datasets - recursive procedure?

David Winsemius dwinsemius at comcast.net
Sun Mar 22 22:11:51 CET 2015


On Mar 22, 2015, at 1:12 PM, Luca Meyer wrote:

> Hi Bert,
> 
> Maybe I did not explain myself clearly enough. But let me show you with a
> manual example that indeed what I would like to do is feasible.
> 
> The following is also available for download from
> https://www.dropbox.com/s/qhmpkkrejjkpbkx/sample_code.txt?dl=0
> 
> rm(list=ls())
> 
> This is usual (an extract of) the INPUT file I have:
> 
> f1 <- structure(list(v1 = c("A", "A", "A", "A", "A", "A", "B", "B",
> "B", "B", "B", "B"), v2 = c("A", "B", "C", "A", "B", "C", "A",
> "B", "C", "A", "B", "C"), v3 = c("B", "B", "B", "C", "C", "C",
> "B", "B", "B", "C", "C", "C"), v4 = c(18.18530, 3.43806,0.00273, 1.42917,
> 1.05786, 0.00042, 2.37232, 3.01835, 0, 1.13430, 0.92872,
> 0)), .Names = c("v1", "v2", "v3", "v4"), class = "data.frame", row.names =
> c(2L,
> 9L, 11L, 41L, 48L, 50L, 158L, 165L, 167L, 197L, 204L, 206L))
> 
> This are the initial marginal distributions
> 
> aggregate(v4~v1*v2,f1,sum)
> aggregate(v4~v3,f1,sum)
> 
> First I order the file such that I have nicely listed 6 distinct v1xv2
> combinations.
> 
> f1 <- f1[order(f1$v1,f1$v2),]
> 
> Then I compute (manually) the relative importance of each v1xv2 combination:
> 
> tAA <-
> (18.18530+1.42917)/(18.18530+1.42917+3.43806+1.05786+0.00273+0.00042+2.37232+1.13430+3.01835+0.92872+0.00000+0.00000)
> # this is for combination v1=A & v2=A
> tAB <-
> (3.43806+1.05786)/(18.18530+1.42917+3.43806+1.05786+0.00273+0.00042+2.37232+1.13430+3.01835+0.92872+0.00000+0.00000)
> # this is for combination v1=A & v2=B
> tAC <-
> (0.00273+0.00042)/(18.18530+1.42917+3.43806+1.05786+0.00273+0.00042+2.37232+1.13430+3.01835+0.92872+0.00000+0.00000)
> # this is for combination v1=A & v2=C
> tBA <-
> (2.37232+1.13430)/(18.18530+1.42917+3.43806+1.05786+0.00273+0.00042+2.37232+1.13430+3.01835+0.92872+0.00000+0.00000)
> # this is for combination v1=B & v2=A
> tBB <-
> (3.01835+0.92872)/(18.18530+1.42917+3.43806+1.05786+0.00273+0.00042+2.37232+1.13430+3.01835+0.92872+0.00000+0.00000)
> # this is for combination v1=B & v2=B
> tBC <-
> (0.00000+0.00000)/(18.18530+1.42917+3.43806+1.05786+0.00273+0.00042+2.37232+1.13430+3.01835+0.92872+0.00000+0.00000)
> # this is for combination v1=B & v2=C
> # and just to make sure I have not made mistakes the following should be
> equal to 1
> tAA+tAB+tAC+tBA+tBB+tBC
> 
> Next, I know I need to increase v4 any time v3=B and the total increase I
> need to have over the whole dataset is 29-27.01676=1.98324. In turn, I need
> to dimish v4 any time V3=C by the same amount (4.55047-2.56723=1.98324).
> This aspect was perhaps not clear at first. I need to move v4 across v3
> categories, but the totals will always remain unchanged.
> 
> Since I want the data alteration to be proportional to the v1xv2
> combinations I do the following:
> 
> f1$v4 <- ifelse (f1$v1=="A" & f1$v2=="A" & f1$v3=="B", f1$v4+(tAA*1.98324),
> f1$v4)
> f1$v4 <- ifelse (f1$v1=="A" & f1$v2=="A" & f1$v3=="C", f1$v4-(tAA*1.98324),
> f1$v4)
> f1$v4 <- ifelse (f1$v1=="A" & f1$v2=="B" & f1$v3=="B", f1$v4+(tAB*1.98324),
> f1$v4)
> f1$v4 <- ifelse (f1$v1=="A" & f1$v2=="B" & f1$v3=="C", f1$v4-(tAB*1.98324),
> f1$v4)
> f1$v4 <- ifelse (f1$v1=="A" & f1$v2=="C" & f1$v3=="B", f1$v4+(tAC*1.98324),
> f1$v4)
> f1$v4 <- ifelse (f1$v1=="A" & f1$v2=="C" & f1$v3=="C", f1$v4-(tAC*1.98324),
> f1$v4)
> f1$v4 <- ifelse (f1$v1=="B" & f1$v2=="A" & f1$v3=="B", f1$v4+(tBA*1.98324),
> f1$v4)
> f1$v4 <- ifelse (f1$v1=="B" & f1$v2=="A" & f1$v3=="C", f1$v4-(tBA*1.98324),
> f1$v4)
> f1$v4 <- ifelse (f1$v1=="B" & f1$v2=="B" & f1$v3=="B", f1$v4+(tBB*1.98324),
> f1$v4)
> f1$v4 <- ifelse (f1$v1=="B" & f1$v2=="B" & f1$v3=="C", f1$v4-(tBB*1.98324),
> f1$v4)
> f1$v4 <- ifelse (f1$v1=="B" & f1$v2=="C" & f1$v3=="B", f1$v4+(tBC*1.98324),
> f1$v4)
> f1$v4 <- ifelse (f1$v1=="B" & f1$v2=="C" & f1$v3=="C", f1$v4-(tBC*1.98324),
> f1$v4)
> 

Seems that this could be done a lot more simply with a lookup matrix and ordinary indexing

> lookarr <- array(NA, dim=c(length(unique(f1$v1)),length(unique(f1$v2)),length(unique(f1$v3)) ) , dimnames=list( unique(f1$v1), unique(f1$v2), unique(f1$v3) ) )
> lookarr[] <- c(tAA,tAA,tAB,tAB,tAC,tAC,tBA,tBA,
                 tBB, tBB, tBC, tBC)

> lookarr[ "A","B","C"]
[1] 0.1250369

> lookarr[ with(f1, cbind(v1, v2, v3)) ]
 [1] 6.213554e-01 1.110842e-01 1.424236e-01 1.250369e-01 9.978703e-05
 [6] 0.000000e+00 6.213554e-01 1.110842e-01 1.424236e-01 1.250369e-01
[11] 9.978703e-05 0.000000e+00
> f1$v4mod <- f1$v4*lookarr[ with(f1, cbind(v1,v2,v3)) ]
> f1
    v1 v2 v3       v4        v4mod
2    A  A  B 18.18530 1.129954e+01
41   A  A  C  1.42917 1.587582e-01
9    A  B  B  3.43806 4.896610e-01
48   A  B  C  1.05786 1.322716e-01
11   A  C  B  0.00273 2.724186e-07
50   A  C  C  0.00042 0.000000e+00
158  B  A  B  2.37232 1.474054e+00
197  B  A  C  1.13430 1.260028e-01
165  B  B  B  3.01835 4.298844e-01
204  B  B  C  0.92872 1.161243e-01
167  B  C  B  0.00000 0.000000e+00
206  B  C  C  0.00000 0.000000e+00

-- 
david.


> This are the final marginal distributions:
> 
> aggregate(v4~v1*v2,f1,sum)
> aggregate(v4~v3,f1,sum)
> 
> Can this procedure be made programmatic so that I can run it on the
> (8x13x13) categories matrix? if so, how would you do it? I have really hard
> time to do it with some (semi)automatic procedure.
> 
> Thank you very much indeed once more :)
> 
> Luca
> 
> 
> 2015-03-22 18:32 GMT+01:00 Bert Gunter <gunter.berton at gene.com>:
> 
>> Nonsense. You are not telling us something or I have failed to
>> understand something.
>> 
>> Consider:
>> 
>> v1 = c("a","b")
>> v2 = "c("a","a")
>> 
>> It is not possible to change the value of a sum of values
>> corresponding to v2="a" without also changing that for v1, which is
>> not supposed to change according to my understanding of your
>> specification.
>> 
>> So I'm done.
>> 
>> -- Bert
>> 
>> 
>> Bert Gunter
>> Genentech Nonclinical Biostatistics
>> (650) 467-7374
>> 
>> "Data is not information. Information is not knowledge. And knowledge
>> is certainly not wisdom."
>> Clifford Stoll
>> 
>> 
>> 
>> 
>> On Sun, Mar 22, 2015 at 8:28 AM, Luca Meyer <lucam1968 at gmail.com> wrote:
>>> Sorry forgot to keep the rest of the group in the loop - Luca
>>> ---------- Forwarded message ----------
>>> From: Luca Meyer <lucam1968 at gmail.com>
>>> Date: 2015-03-22 16:27 GMT+01:00
>>> Subject: Re: [R] Joining two datasets - recursive procedure?
>>> To: Bert Gunter <gunter.berton at gene.com>
>>> 
>>> 
>>> Hi Bert,
>>> 
>>> That is exactly what I am trying to achieve. Please notice that negative
>> v4
>>> values are allowed. I have done a similar task in the past manually by
>>> recursively alterating v4 distribution across v3 categories within fix
>> each
>>> v1&v2 combination so I am quite positive it can be achieved but honestly
>> I
>>> took me forever to do it manually and since this is likely to be an
>>> exercise I need to repeat from time to time I wish I could learn how to
>> do
>>> it programmatically....
>>> 
>>> Thanks again for any further suggestion you might have,
>>> 
>>> Luca
>>> 
>>> 
>>> 2015-03-22 16:05 GMT+01:00 Bert Gunter <gunter.berton at gene.com>:
>>> 
>>>> Oh, wait a minute ...
>>>> 
>>>> You still want the marginals for the other columns to be as originally?
>>>> 
>>>> If so, then this is impossible in general as the sum of all the values
>>>> must be what they were originally and you cannot therefore choose your
>>>> values for V3 arbitrarily.
>>>> 
>>>> Or at least, that seems to be what you are trying to do.
>>>> 
>>>> -- Bert
>>>> 
>>>> Bert Gunter
>>>> Genentech Nonclinical Biostatistics
>>>> (650) 467-7374
>>>> 
>>>> "Data is not information. Information is not knowledge. And knowledge
>>>> is certainly not wisdom."
>>>> Clifford Stoll
>>>> 
>>>> 
>>>> 
>>>> 
>>>> On Sun, Mar 22, 2015 at 7:55 AM, Bert Gunter <bgunter at gene.com> wrote:
>>>>> I would have thought that this is straightforward given my previous
>>>> email...
>>>>> 
>>>>> Just set z to what you want -- e,g, all B values to 29/number of B's,
>>>>> and all C values to 2.567/number of C's (etc. for more categories).
>>>>> 
>>>>> A slick but sort of cheat way to do this programmatically -- in the
>>>>> sense that it relies on the implementation of factor() rather than its
>>>>> API -- is:
>>>>> 
>>>>> y <- f1$v3  ## to simplify the notation; could be done using with()
>>>>> z <- (c(29,2.567)/table(y))[c(y)]
>>>>> 
>>>>> Then proceed to z1 as I previously described
>>>>> 
>>>>> -- Bert
>>>>> 
>>>>> 
>>>>> Bert Gunter
>>>>> Genentech Nonclinical Biostatistics
>>>>> (650) 467-7374
>>>>> 
>>>>> "Data is not information. Information is not knowledge. And knowledge
>>>>> is certainly not wisdom."
>>>>> Clifford Stoll
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> On Sun, Mar 22, 2015 at 2:00 AM, Luca Meyer <lucam1968 at gmail.com>
>> wrote:
>>>>>> Hi Bert, hello R-experts,
>>>>>> 
>>>>>> I am close to a solution but I still need one hint w.r.t. the
>> following
>>>>>> procedure (available also from
>>>>>> https://www.dropbox.com/s/qhmpkkrejjkpbkx/sample_code.txt?dl=0)
>>>>>> 
>>>>>> rm(list=ls())
>>>>>> 
>>>>>> # this is (an extract of) the INPUT file I have:
>>>>>> f1 <- structure(list(v1 = c("A", "A", "A", "A", "A", "A", "B", "B",
>> "B",
>>>>>> "B", "B", "B"), v2 = c("A", "B", "C", "A", "B", "C", "A", "B", "C",
>> "A",
>>>>>> "B", "C"), v3 = c("B", "B", "B", "C", "C", "C", "B", "B", "B", "C",
>> "C",
>>>>>> "C"), v4 = c(18.18530, 3.43806,0.00273, 1.42917, 1.05786, 0.00042,
>>>> 2.37232,
>>>>>> 3.01835, 0, 1.13430, 0.92872, 0)), .Names = c("v1", "v2", "v3",
>> "v4"),
>>>> class
>>>>>> = "data.frame", row.names = c(2L, 9L, 11L, 41L, 48L, 50L, 158L, 165L,
>>>> 167L,
>>>>>> 197L, 204L, 206L))
>>>>>> 
>>>>>> # this is the procedure that Bert suggested (slightly adjusted):
>>>>>> z <- rnorm(nrow(f1)) ## or anything you want
>>>>>> z1 <- round(with(f1,v4 + z -ave(z,v1,v2,FUN=mean)), digits=5)
>>>>>> aggregate(v4~v1*v2,f1,sum)
>>>>>> aggregate(z1~v1*v2,f1,sum)
>>>>>> aggregate(v4~v3,f1,sum)
>>>>>> aggregate(z1~v3,f1,sum)
>>>>>> 
>>>>>> My question to you is: how can I set z so that I can obtain specific
>>>> values
>>>>>> for z1-v4 in the v3 aggregation?
>>>>>> In other words, how can I configure the procedure so that e.g. B=29
>> and
>>>>>> C=2.56723 after running the procedure:
>>>>>> aggregate(z1~v3,f1,sum)
>>>>>> 
>>>>>> Thank you,
>>>>>> 
>>>>>> Luca
>>>>>> 
>>>>>> PS: to avoid any doubts you might have about who I am the following
>> is
>>>> my
>>>>>> web page: http://lucameyer.wordpress.com/
>>>>>> 
>>>>>> 
>>>>>> 2015-03-21 18:13 GMT+01:00 Bert Gunter <gunter.berton at gene.com>:
>>>>>>> 
>>>>>>> ... or cleaner:
>>>>>>> 
>>>>>>> z1 <- with(f1,v4 + z -ave(z,v1,v2,FUN=mean))
>>>>>>> 
>>>>>>> 
>>>>>>> Just for curiosity, was this homework? (in which case I should
>>>>>>> probably have not provided you an answer -- that is, assuming that I
>>>>>>> HAVE provided an answer).
>>>>>>> 
>>>>>>> Cheers,
>>>>>>> Bert
>>>>>>> 
>>>>>>> Bert Gunter
>>>>>>> Genentech Nonclinical Biostatistics
>>>>>>> (650) 467-7374
>>>>>>> 
>>>>>>> "Data is not information. Information is not knowledge. And
>> knowledge
>>>>>>> is certainly not wisdom."
>>>>>>> Clifford Stoll
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> On Sat, Mar 21, 2015 at 7:53 AM, Bert Gunter <bgunter at gene.com>
>> wrote:
>>>>>>>> z <- rnorm(nrow(f1)) ## or anything you want
>>>>>>>> z1 <- f1$v4 + z - with(f1,ave(z,v1,v2,FUN=mean))
>>>>>>>> 
>>>>>>>> 
>>>>>>>> aggregate(v4~v1,f1,sum)
>>>>>>>> aggregate(z1~v1,f1,sum)
>>>>>>>> aggregate(v4~v2,f1,sum)
>>>>>>>> aggregate(z1~v2,f1,sum)
>>>>>>>> aggregate(v4~v3,f1,sum)
>>>>>>>> aggregate(z1~v3,f1,sum)
>>>>>>>> 
>>>>>>>> 
>>>>>>>> Cheers,
>>>>>>>> Bert
>>>>>>>> 
>>>>>>>> Bert Gunter
>>>>>>>> Genentech Nonclinical Biostatistics
>>>>>>>> (650) 467-7374
>>>>>>>> 
>>>>>>>> "Data is not information. Information is not knowledge. And
>> knowledge
>>>>>>>> is certainly not wisdom."
>>>>>>>> Clifford Stoll
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> On Sat, Mar 21, 2015 at 6:49 AM, Luca Meyer <lucam1968 at gmail.com>
>>>> wrote:
>>>>>>>>> Hi Bert,
>>>>>>>>> 
>>>>>>>>> Thank you for your message. I am looking into ave() and tapply()
>> as
>>>> you
>>>>>>>>> suggested but at the same time I have prepared a example of input
>>>> and
>>>>>>>>> output
>>>>>>>>> files, just in case you or someone else would like to make an
>>>> attempt
>>>>>>>>> to
>>>>>>>>> generate a code that goes from input to output.
>>>>>>>>> 
>>>>>>>>> Please see below or download it from
>>>>>>>>> https://www.dropbox.com/s/qhmpkkrejjkpbkx/sample_code.txt?dl=0
>>>>>>>>> 
>>>>>>>>> # this is (an extract of) the INPUT file I have:
>>>>>>>>> f1 <- structure(list(v1 = c("A", "A", "A", "A", "A", "A", "B",
>> "B",
>>>>>>>>> "B", "B", "B", "B"), v2 = c("A", "B", "C", "A", "B", "C", "A",
>>>>>>>>> "B", "C", "A", "B", "C"), v3 = c("B", "B", "B", "C", "C", "C",
>>>>>>>>> "B", "B", "B", "C", "C", "C"), v4 = c(18.18530, 3.43806,0.00273,
>>>>>>>>> 1.42917,
>>>>>>>>> 1.05786, 0.00042, 2.37232, 3.01835, 0, 1.13430, 0.92872,
>>>>>>>>> 0)), .Names = c("v1", "v2", "v3", "v4"), class = "data.frame",
>>>>>>>>> row.names =
>>>>>>>>> c(2L,
>>>>>>>>> 9L, 11L, 41L, 48L, 50L, 158L, 165L, 167L, 197L, 204L, 206L))
>>>>>>>>> 
>>>>>>>>> # this is (an extract of) the OUTPUT file I would like to obtain:
>>>>>>>>> f2 <- structure(list(v1 = c("A", "A", "A", "A", "A", "A", "B",
>> "B",
>>>>>>>>> "B", "B", "B", "B"), v2 = c("A", "B", "C", "A", "B", "C", "A",
>>>>>>>>> "B", "C", "A", "B", "C"), v3 = c("B", "B", "B", "C", "C", "C",
>>>>>>>>> "B", "B", "B", "C", "C", "C"), v4 = c(17.83529, 3.43806,0.00295,
>>>>>>>>> 1.77918,
>>>>>>>>> 1.05786, 0.0002, 2.37232, 3.01835, 0, 1.13430, 0.92872,
>>>>>>>>> 0)), .Names = c("v1", "v2", "v3", "v4"), class = "data.frame",
>>>>>>>>> row.names =
>>>>>>>>> c(2L,
>>>>>>>>> 9L, 11L, 41L, 48L, 50L, 158L, 165L, 167L, 197L, 204L, 206L))
>>>>>>>>> 
>>>>>>>>> # please notice that while the aggregated v4 on v3 has changed …
>>>>>>>>> aggregate(f1[,c("v4")],list(f1$v3),sum)
>>>>>>>>> aggregate(f2[,c("v4")],list(f2$v3),sum)
>>>>>>>>> 
>>>>>>>>> # … the aggregated v4 over v1xv2 has remained unchanged:
>>>>>>>>> aggregate(f1[,c("v4")],list(f1$v1,f1$v2),sum)
>>>>>>>>> aggregate(f2[,c("v4")],list(f2$v1,f2$v2),sum)
>>>>>>>>> 
>>>>>>>>> Thank you very much in advance for your assitance.
>>>>>>>>> 
>>>>>>>>> Luca
>>>>>>>>> 
>>>>>>>>> 2015-03-21 13:18 GMT+01:00 Bert Gunter <gunter.berton at gene.com>:
>>>>>>>>>> 
>>>>>>>>>> 1. Still not sure what you mean, but maybe look at ?ave and
>>>> ?tapply,
>>>>>>>>>> for which ave() is a wrapper.
>>>>>>>>>> 
>>>>>>>>>> 2. You still need to heed the rest of Jeff's advice.
>>>>>>>>>> 
>>>>>>>>>> Cheers,
>>>>>>>>>> Bert
>>>>>>>>>> 
>>>>>>>>>> Bert Gunter
>>>>>>>>>> Genentech Nonclinical Biostatistics
>>>>>>>>>> (650) 467-7374
>>>>>>>>>> 
>>>>>>>>>> "Data is not information. Information is not knowledge. And
>>>> knowledge
>>>>>>>>>> is certainly not wisdom."
>>>>>>>>>> Clifford Stoll
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> On Sat, Mar 21, 2015 at 4:53 AM, Luca Meyer <
>> lucam1968 at gmail.com>
>>>>>>>>>> wrote:
>>>>>>>>>>> Hi Jeff & other R-experts,
>>>>>>>>>>> 
>>>>>>>>>>> Thank you for your note. I have tried myself to solve the
>> issue
>>>>>>>>>>> without
>>>>>>>>>>> success.
>>>>>>>>>>> 
>>>>>>>>>>> Following your suggestion, I am providing a sample of the
>>>> dataset I
>>>>>>>>>>> am
>>>>>>>>>>> using below (also downloadble in plain text from
>>>>>>>>>>> 
>> https://www.dropbox.com/s/qhmpkkrejjkpbkx/sample_code.txt?dl=0):
>>>>>>>>>>> 
>>>>>>>>>>> #this is an extract of the overall dataset (n=1200 cases)
>>>>>>>>>>> f1 <- structure(list(v1 = c("A", "A", "A", "A", "A", "A", "B",
>>>> "B",
>>>>>>>>>>> "B", "B", "B", "B"), v2 = c("A", "B", "C", "A", "B", "C", "A",
>>>>>>>>>>> "B", "C", "A", "B", "C"), v3 = c("B", "B", "B", "C", "C", "C",
>>>>>>>>>>> "B", "B", "B", "C", "C", "C"), v4 = c(18.1853007621835,
>>>>>>>>>>> 3.43806581506388,
>>>>>>>>>>> 0.002733567617055, 1.42917483425029, 1.05786640463504,
>>>>>>>>>>> 0.000420548864162308,
>>>>>>>>>>> 2.37232740842861, 3.01835841813241, 0, 1.13430282139936,
>>>>>>>>>>> 0.928725667117666,
>>>>>>>>>>> 0)), .Names = c("v1", "v2", "v3", "v4"), class = "data.frame",
>>>>>>>>>>> row.names
>>>>>>>>>>> =
>>>>>>>>>>> c(2L,
>>>>>>>>>>> 9L, 11L, 41L, 48L, 50L, 158L, 165L, 167L, 197L, 204L, 206L))
>>>>>>>>>>> 
>>>>>>>>>>> I need to find a automated procedure that allows me to adjust
>> v3
>>>>>>>>>>> marginals
>>>>>>>>>>> while maintaining v1xv2 marginals unchanged.
>>>>>>>>>>> 
>>>>>>>>>>> That is: modify the v4 values you can find by running:
>>>>>>>>>>> 
>>>>>>>>>>> aggregate(f1[,c("v4")],list(f1$v3),sum)
>>>>>>>>>>> 
>>>>>>>>>>> while maintaining costant the values you can find by running:
>>>>>>>>>>> 
>>>>>>>>>>> aggregate(f1[,c("v4")],list(f1$v1,f1$v2),sum)
>>>>>>>>>>> 
>>>>>>>>>>> Now does it make sense?
>>>>>>>>>>> 
>>>>>>>>>>> Please notice I have tried to build some syntax that tries to
>>>> modify
>>>>>>>>>>> values
>>>>>>>>>>> within each v1xv2 combination by computing sum of v4, row
>>>> percentage
>>>>>>>>>>> in
>>>>>>>>>>> terms of v4, and there is where my effort is blocked. Not
>> really
>>>>>>>>>>> sure
>>>>>>>>>>> how I
>>>>>>>>>>> should proceed. Any suggestion?
>>>>>>>>>>> 
>>>>>>>>>>> Thanks,
>>>>>>>>>>> 
>>>>>>>>>>> Luca
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 2015-03-19 2:38 GMT+01:00 Jeff Newmiller <
>>>> jdnewmil at dcn.davis.ca.us>:
>>>>>>>>>>> 
>>>>>>>>>>>> I don't understand your description. The standard practice on
>>>> this
>>>>>>>>>>>> list
>>>>>>>>>>>> is
>>>>>>>>>>>> to provide a reproducible R example [1] of the kind of data
>> you
>>>> are
>>>>>>>>>>>> working
>>>>>>>>>>>> with (and any code you have tried) to go along with your
>>>>>>>>>>>> description.
>>>>>>>>>>>> In
>>>>>>>>>>>> this case, that would be two dputs of your input data frames
>>>> and a
>>>>>>>>>>>> dput
>>>>>>>>>>>> of
>>>>>>>>>>>> an output data frame (generated by hand from your input data
>>>>>>>>>>>> frame).
>>>>>>>>>>>> (Probably best to not use the full number of input values
>> just
>>>> to
>>>>>>>>>>>> keep
>>>>>>>>>>>> the
>>>>>>>>>>>> size down.) We could then make an attempt to generate code
>> that
>>>>>>>>>>>> goes
>>>>>>>>>>>> from
>>>>>>>>>>>> input to output.
>>>>>>>>>>>> 
>>>>>>>>>>>> Of course, if you post that hard work using HTML then it will
>>>> get
>>>>>>>>>>>> corrupted (much like the text below from your earlier emails)
>>>> and
>>>>>>>>>>>> we
>>>>>>>>>>>> won't
>>>>>>>>>>>> be able to use it. Please learn to post from your email
>> software
>>>>>>>>>>>> using
>>>>>>>>>>>> plain text when corresponding with this mailing list.
>>>>>>>>>>>> 
>>>>>>>>>>>> [1]
>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>> 
>> http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example
>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>> 
>> ---------------------------------------------------------------------------
>>>>>>>>>>>> Jeff Newmiller                        The     .....
>>>> .....  Go
>>>>>>>>>>>> Live...
>>>>>>>>>>>> DCN:<jdnewmil at dcn.davis.ca.us>        Basics: ##.#.
>> ##.#.
>>>>>>>>>>>> Live
>>>>>>>>>>>> Go...
>>>>>>>>>>>>                                      Live:   OO#.. Dead:
>> OO#..
>>>>>>>>>>>> Playing
>>>>>>>>>>>> Research Engineer (Solar/Batteries            O.O#.
>> #.O#.
>>>>>>>>>>>> with
>>>>>>>>>>>> /Software/Embedded Controllers)               .OO#.
>> .OO#.
>>>>>>>>>>>> rocks...1k
>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>> 
>> ---------------------------------------------------------------------------
>>>>>>>>>>>> Sent from my phone. Please excuse my brevity.
>>>>>>>>>>>> 
>>>>>>>>>>>> On March 18, 2015 9:05:37 AM PDT, Luca Meyer <
>>>> lucam1968 at gmail.com>
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>> Thanks for you input Michael,
>>>>>>>>>>>>> 
>>>>>>>>>>>>> The continuous variable I have measures quantities (down to
>> the
>>>>>>>>>>>>> 3rd
>>>>>>>>>>>>> decimal level) so unfortunately are not frequencies.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Any more specific suggestions on how that could be tackled?
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Thanks & kind regards,
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Luca
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> ===
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Michael Friendly wrote:
>>>>>>>>>>>>> I'm not sure I understand completely what you want to do,
>> but
>>>>>>>>>>>>> if the data were frequencies, it sounds like task for
>> fitting a
>>>>>>>>>>>>> loglinear model with the model formula
>>>>>>>>>>>>> 
>>>>>>>>>>>>> ~ V1*V2 + V3
>>>>>>>>>>>>> 
>>>>>>>>>>>>> On 3/18/2015 2:17 AM, Luca Meyer wrote:
>>>>>>>>>>>>>> * Hello,
>>>>>>>>>>>>> *>>* I am facing a quite challenging task (at least to me)
>> and
>>>> I
>>>>>>>>>>>>> was
>>>>>>>>>>>>> wondering
>>>>>>>>>>>>> *>* if someone could advise how R could assist me to speed
>> the
>>>>>>>>>>>>> task
>>>>>>>>>>>>> up.
>>>>>>>>>>>>> *>>* I am dealing with a dataset with 3 discrete variables
>> and
>>>> one
>>>>>>>>>>>>> continuous
>>>>>>>>>>>>> *>* variable. The discrete variables are:
>>>>>>>>>>>>> *>>* V1: 8 modalities
>>>>>>>>>>>>> *>* V2: 13 modalities
>>>>>>>>>>>>> *>* V3: 13 modalities
>>>>>>>>>>>>> *>>* The continuous variable V4 is a decimal number always
>>>> greater
>>>>>>>>>>>>> than
>>>>>>>>>>>>> zero in
>>>>>>>>>>>>> *>* the marginals of each of the 3 variables but it is
>>>> sometimes
>>>>>>>>>>>>> equal
>>>>>>>>>>>>> to zero
>>>>>>>>>>>>> *>* (and sometimes negative) in the joint tables.
>>>>>>>>>>>>> *>>* I have got 2 files:
>>>>>>>>>>>>> *>>* => one with distribution of all possible combinations
>> of
>>>>>>>>>>>>> V1xV2
>>>>>>>>>>>>> (some of
>>>>>>>>>>>>> *>* which are zero or neagtive) and
>>>>>>>>>>>>> *>* => one with the marginal distribution of V3.
>>>>>>>>>>>>> *>>* I am trying to build the long and narrow dataset
>> V1xV2xV3
>>>> in
>>>>>>>>>>>>> such
>>>>>>>>>>>>> a way
>>>>>>>>>>>>> *>* that each V1xV2 cell does not get modified and V3 fits
>> as
>>>>>>>>>>>>> closely
>>>>>>>>>>>>> as
>>>>>>>>>>>>> *>* possible to its marginal distribution. Does it make
>> sense?
>>>>>>>>>>>>> *>>* To be even more specific, my 2 input files look like
>> the
>>>>>>>>>>>>> following.
>>>>>>>>>>>>> *>>* FILE 1
>>>>>>>>>>>>> *>* V1,V2,V4
>>>>>>>>>>>>> *>* A, A, 24.251
>>>>>>>>>>>>> *>* A, B, 1.065
>>>>>>>>>>>>> *>* (...)
>>>>>>>>>>>>> *>* B, C, 0.294
>>>>>>>>>>>>> *>* B, D, 2.731
>>>>>>>>>>>>> *>* (...)
>>>>>>>>>>>>> *>* H, L, 0.345
>>>>>>>>>>>>> *>* H, M, 0.000
>>>>>>>>>>>>> *>>* FILE 2
>>>>>>>>>>>>> *>* V3, V4
>>>>>>>>>>>>> *>* A, 1.575
>>>>>>>>>>>>> *>* B, 4.294
>>>>>>>>>>>>> *>* C, 10.044
>>>>>>>>>>>>> *>* (...)
>>>>>>>>>>>>> *>* L, 5.123
>>>>>>>>>>>>> *>* M, 3.334
>>>>>>>>>>>>> *>>* What I need to achieve is a file such as the following
>>>>>>>>>>>>> *>>* FILE 3
>>>>>>>>>>>>> *>* V1, V2, V3, V4
>>>>>>>>>>>>> *>* A, A, A, ???
>>>>>>>>>>>>> *>* A, A, B, ???
>>>>>>>>>>>>> *>* (...)
>>>>>>>>>>>>> *>* D, D, E, ???
>>>>>>>>>>>>> *>* D, D, F, ???
>>>>>>>>>>>>> *>* (...)
>>>>>>>>>>>>> *>* H, M, L, ???
>>>>>>>>>>>>> *>* H, M, M, ???
>>>>>>>>>>>>> *>>* Please notice that FILE 3 need to be such that if I
>>>> aggregate
>>>>>>>>>>>>> on
>>>>>>>>>>>>> V1+V2 I
>>>>>>>>>>>>> *>* recover exactly FILE 1 and that if I aggregate on V3 I
>> can
>>>>>>>>>>>>> recover
>>>>>>>>>>>>> a file
>>>>>>>>>>>>> *>* as close as possible to FILE 3 (ideally the same file).
>>>>>>>>>>>>> *>>* Can anyone suggest how I could do that with R?
>>>>>>>>>>>>> *>>* Thank you very much indeed for any assistance you are
>>>> able to
>>>>>>>>>>>>> provide.
>>>>>>>>>>>>> *>>* Kind regards,
>>>>>>>>>>>>> *>>* Luca*
>>>>>>>>>>>>> 
>>>>>>>>>>>>>      [[alternative HTML version deleted]]


David Winsemius
Alameda, CA, USA



More information about the R-help mailing list