[R] beginner programming question
Tony Plate
tplate at blackmesacapital.com
Wed Dec 17 23:40:52 CET 2003
Another way to approach this is to first massage the data into a more
regular format. This may or may not be simpler or faster than other
solutions suggested.
> x <- read.table("clipboard", header=T)
> x
rel1 rel2 rel3 age0 age1 age2 age3 sex0 sex1 sex2 sex3
1 1 3 NA 25 23 2 NA 1 2 1 NA
2 4 1 3 35 67 34 10 2 2 1 2
3 1 4 4 39 40 59 60 1 2 2 1
4 4 NA NA 45 70 NA NA 2 2 NA NA
> nn <- c("rel","age0","age","sex0","sex")
> xx <- rbind("colnames<-"(x[,c("rel1","age0","age1","sex0","sex1")], nn),
+ "colnames<-"(x[,c("rel2","age0","age2","sex0","sex2")], nn),
+ "colnames<-"(x[,c("rel3","age0","age3","sex0","sex3")], nn))
> xx
rel age0 age sex0 sex
1 1 25 23 1 2
2 4 35 67 2 2
3 1 39 40 1 2
4 4 45 70 2 2
11 3 25 2 1 1
21 1 35 34 2 1
31 4 39 59 1 2
41 NA 45 NA 2 NA
12 NA 25 NA 1 NA
22 3 35 10 2 2
32 4 39 60 1 1
42 NA 45 NA 2 NA
>
> rbind(subset(xx, xx$rel==1 & (xx$sex0==1 |
xx$sex0==xx$sex))[,c("age0","age")], subset(xx, xx$rel==1 & xx$sex==1 &
xx$sex0!=xx$sex)[,c("age","age0")])
age0 age
1 25 23
3 39 40
21 35 34
>
hope this helps,
Tony Plate
PS. To advanced R users: Is the above usage of the "colnames<-" function
within an expression regarded as acceptable or as undesirable programming
style? -- I've rarely seen it used, but it can be quite useful.
At Wednesday 09:28 PM 12/17/2003 +0200, Adrian Dusa wrote:
>Hi all,
>
>
>
>The last e-mails about beginners gave me the courage to post a question;
>from a beginner's perspective, there are a lot of questions that I'm
>tempted to ask. But I'm trying to find the answers either in the
>documentation, either in the about 15 free books I have, either in the
>help archives (I often found many similar questions posted in the past).
>
>Being an (still actual) user of SPSS, I'd like to be able to do
>everything in R. I've learned that the best way of doing it is to
>struggle and find a solution no matter what, refraining from doing it
>with SPSS. I've became more and more aware of the almost unlimited
>possibilities that R offers and I'd like to completely switch to R
>whenever I think I'm ready.
>
>
>
>I have a (rather theoretical) programming problem for which I have found
>a solution, but I feel it is a rather poor one. I wonder if there's some
>other (more clever) solution, using (maybe?) vectorization or
>subscripting.
>
>
>
>A toy example would be:
>
>
>
>rel1 rel2 rel3 age0 age1 age2 age3
>sex0 sex1 sex2 sex3
>
>1 3 NA 25 23 2 NA
>1 2 1 NA
>
>4 1 3 35 67 34 10
>2 2 1 2
>
>1 4 4 39 40 59 60
>1 2 2 1
>
>4 NA NA 45 70 NA NA
>2 2 NA NA
>
>
>
>where rel1...3 states the kinship with the respondent (person 0)
>
>code 1 meaning husband/wife, code 4 meaning parent and code 3 for
>children.
>
>
>
>I would like to get the age for husbands (code 1) in a first column and
>wife's age in the second:
>
>
>
>ageh agew
>
>25 23
>
>34 35
>
>39 40
>
>
>
>My solution uses *for* loops and *if*s checking for code 1 in each
>element in the first 3 columns, then checking in the last three columns
>for husband's code, then taking the corresponding age in a new matrix.
>I've learned that *for* loops are very slow (and indeed with my dataset
>of some 2000 rows and 13 columns for kinship it takes quite a lot).
>
>I found the "Looping" chapter in "S poetry" very useful (it did saved me
>from *for* loops a couple of times, thanks!).
>
>
>
>Any hints would be appreciated,
>
>Adrian
>
>
>
>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>Adrian Dusa (adi at roda.ro)
>Romanian Social Data Archive (www.roda.ro <http://www.roda.ro/> )
>1, Schitu Magureanu Bd.
>76625 Bucharest sector 5
>Romania
>
>
>Tel./Fax:
>
>+40 (21) 312.66.18\
>
>+40 (21) 312.02.10/ int.101
>
>
>
>
> [[alternative HTML version deleted]]
>
>______________________________________________
>R-help at stat.math.ethz.ch mailing list
>https://www.stat.math.ethz.ch/mailman/listinfo/r-help
More information about the R-help
mailing list