[R] vector indexing problem in multilevel data: assigning a specific value to all group members
Bertolt Meyer
bmeyer at sozpsy.uzh.ch
Tue Dec 22 11:42:49 CET 2009
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
More information about the R-help
mailing list