[R] vector indexing problem in multilevel data: assigning a specific value to all group members

Gabor Grothendieck ggrothendieck at gmail.com
Tue Dec 22 16:10:33 CET 2009


Here is one other solution.  This one uses sqldf and is the SQL
analogue of Henrique's solution.  It merges df with a copy of itself
restricted to those rows with groupLeader equal to 1 displaying the
indicated columns.

library(sqldf)
sqldf("select b.personId, b.groupId, b.groupLeader, b.someAttribute,
a.someAttribute leaderAttribute
   from df a join df b using (groupId)
   where a.groupLeader = 1")



On Tue, Dec 22, 2009 at 8:57 AM, Gabor Grothendieck
<ggrothendieck at gmail.com> wrote:
> Try this. The function f takes a vector of indices and returns the
> attribute for the unique groupLeader row among them.  We use ave to
> apply to each set of indices having a common groupId.
>
> f <- function(ix) with(df[ix,], someAttribute[groupLeader == 1])
> transform(df, leaderAttribute = ave(1:nrow(df), df$groupId, FUN = f))
>
>
>
> On Tue, Dec 22, 2009 at 5:42 AM, Bertolt Meyer <bmeyer at sozpsy.uzh.ch> wrote:
>> Dear List,
>>
>> I work with multilevel data from psychological group experiments and have
>> frequently encountered a situation for which I haven't found an elegant
>> solution: I need to assign the value of a specific group member to all
>> members of the group. For example, I have a group leader (identified by a
>> binary vector) and some attribute for all group members. I want to create a
>> new vector that holds the attribute of the group leader for each individual
>> in the data frame (code at the bottom of the post):
>>
>>  personId groupId groupLeader someAttribute leaderAttribute
>> 1        1      17           0   0.145833333              NA
>> 2        2      17           1   0.218750000              NA
>> 3        3      17           0   0.089743590              NA
>> 4        4      22           0   0.003875969              NA
>> 5        5      22           0   0.086486486              NA
>> 6        6      22           0   0.218750000              NA
>> 7        7      22           1   0.089743590              NA
>> 8        8      37           1   0.016129032              NA
>> 9        9      37           0   0.151898734              NA
>>
>> I need this:
>>
>>  personId groupId groupLeader someAttribute leaderAttribute
>> 1        1      17           0   0.145833333     0.218750000
>> 2        2      17           1   0.218750000     0.218750000
>> 3        3      17           0   0.089743590     0.218750000
>> 4        4      22           0   0.003875969     0.089743590
>> 5        5      22           0   0.086486486     0.089743590
>> 6        6      22           0   0.218750000     0.089743590
>> 7        7      22           1   0.089743590     0.089743590
>> 8        8      37           1   0.016129032     0.016129032
>> 9        9      37           0   0.151898734     0.016129032
>>
>> So far, my attemps along the lines of
>>
>> df$leaderAttribute <- df$someAttribute[df$groupLeader == 1][df$groupId]
>>
>> have failed if the groups were not numbered with 1, 2, 3... as in the
>> example above. I need something simple for transforming the groupId vector
>> from 17, 17, 17, 22... to 1,1,1,2... for doing the second indexing. It seems
>> like a simple problem, but I am unable to get it right. I had to fall back
>> to building a specific function employing nested for() loops for achieving
>> this. However, this is error prone and very slow, as some of my data sets
>> are very large. What am I missing?
>>
>> Any help would be greatly appreciated.
>> Regards,
>> Bertolt
>>
>> Code:
>>
>> personId <- c(1,2,3,4,5,6,7,8,9)
>> groupId <- c(17,17,17,22,22,22,22,37,37)
>> groupLeader <- c(0,1,0,0,0,0,1,1,0)
>> someAttribute <- c(0.145833333, 0.218750000, 0.089743590, 0.003875969,
>> 0.086486486, 0.218750000, 0.089743590, 0.016129032, 0.151898734)
>> leaderAttribute <- c(NA,NA,NA,NA,NA,NA,NA,NA,NA)
>>
>> df <- cbind(personId, groupId, groupLeader, someAttribute, leaderAttribute)
>> df <- as.data.frame(df)
>> df
>>
>> rm(personId, groupId, groupLeader, someAttribute, leaderAttribute, df)
>>
>> --
>> Dr. Bertolt Meyer
>> Senior research and teaching associate
>> Social Psychology, Institute of Psychology, University of Zurich
>> Binzmuehlestrasse 14, Box 15
>> CH-8050 Zurich
>> Switzerland
>>
>> bmeyer at sozpsy.uzh.ch
>> tel:   +41446357282
>> fax:   +41446357279
>>
>> ______________________________________________
>> 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