An embedded and charset-unspecified text was scrubbed... Name: not available URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20121124/b73c04e9/attachment.pl>
Adding a new variable to each element of a list
5 messages · Stephen Politzer-Ahles, arun
HI,
The example data you gave have only one row for the 1st element of list.? So, it would be better to add it as:
?lapply(result,function(x) {x[[2]]<-y
?return(x)})
#$`Error: subject`
#Component 1 :
?# ??????? Df Sum Sq Mean Sq F value Pr(>F)
#Residuals? 4?? 12.4???? 3.1??????????????
#
#Component 2 :
#[1] 0.5000000 0.7724138
-----------------------------
You can also do:
?lapply(result,function(x) {x[[1]][6]<-y[1]
?x[[1]][7]<-y[2]
?return(x)})
#$`Error: subject`
?# ??????? Df Sum Sq Mean Sq F value Pr(>F)? V6???? V7
#Residuals? 4?? 12.4???? 3.1??????????????? 0.5 0.7724
#$`Error: subject:myfactor`
?# ??????? Df Sum Sq Mean Sq F value?? Pr(>F)? V6???? V7
#myfactor?? 2? 14.93?? 7.467?? 13.58 0.002683 0.5 0.7724
#Residuals? 8?? 4.40?? 0.550????????????????? 0.5 0.7724??? #Here it got repeated
May be there are better methods
A.K.
----- Original Message -----
From: Stephen Politzer-Ahles <politzerahless at gmail.com>
To: r-help at r-project.org
Cc:
Sent: Saturday, November 24, 2012 5:33 PM
Subject: [R] Adding a new variable to each element of a list
Hello,
I have a list of data with multiple elements, and each element in the list
has multiple variables in it. Here's an example:
### Make the fake data
dv <- c(1,3,4,2,2,3,2,5,6,3,4,4,3,5,6)
subject <- factor(c("s1","s1","s1","s2","s2","s2","s3","s3","s3",
"s4","s4","s4","s5","s5","s5"))
myfactor <- factor(c("f1","f2","f3","f1","f2","f3","f1","f2","f3",
"f1","f2","f3","f1","f2","f3"))
mydata <- data.frame(dv, subject, myfactor)
### Do the anova and store the summary in "result"
mydata.aov <- aov( dv ~ myfactor + Error(subject/myfactor), mydata )
( result <- summary( mydata.aov ) ) # see the anova
str(result)
List of 2
$ Error: subject? ? ? ? :List of 1
? ..$ :Classes ?anova? and 'data.frame':? ? ? ? 1 obs. of? 5 variables:
? .. ..$ Df? ? : num 4
? .. ..$ Sum Sq : num 12.4
? .. ..$ Mean Sq: num 3.1
? .. ..$ F value: num NA
? .. ..$ Pr(>F) : num NA
? ..- attr(*, "class")= chr [1:2] "summary.aov" "listof"
$ Error: subject:myfactor:List of 1
? ..$ :Classes ?anova? and 'data.frame':? ? ? ? 2 obs. of? 5 variables:
? .. ..$ Df? ? : num [1:2] 2 8
? .. ..$ Sum Sq : num [1:2] 14.9 4.4
? .. ..$ Mean Sq: num [1:2] 7.47 0.55
? .. ..$ F value: num [1:2] 13.6 NA
? .. ..$ Pr(>F) : num [1:2] 0.00268 NA
? ..- attr(*, "class")= chr [1:2] "summary.aov" "listof"
As you can see, each element in "result" has several variables (Df, Sum Sq,
Mean Sq, F value, Pr(>F)):
str( result[[2]][[1]] )
Classes ?anova? and 'data.frame':? ? ? 2 obs. of? 5 variables:
$ Df? ? : num? 2 8
$ Sum Sq : num? 14.9 4.4
$ Mean Sq: num? 7.47 0.55
$ F value: num? 13.6 NA
$ Pr(>F) : num? 0.00268 NA
Now I also have another vector of numbers that I would like to add to the
list, as a 6th variable for each element:
y <- c(.5, .7724138)
Ideally, I would like each element in the list ("Error: subject" and
"Error: subject:myfactor") to have a 6th variable, so the new str() would
look like:
List of 2
$ Error: subject? ? ? ? :List of 1
? ..$ :Classes ?anova? and 'data.frame':? ? ? ? 1 obs. of? 5 variables:
? .. ..$ Df? ? : num 4
? .. ..$ Sum Sq : num 12.4
? .. ..$ Mean Sq: num 3.1
? .. ..$ F value: num NA
? .. ..$ Pr(>F) : num NA
* .. ..$ Thing? : num 0.50*
? ..- attr(*, "class")= chr [1:2] "summary.aov" "listof"
$ Error: subject:myfactor:List of 1
? ..$ :Classes ?anova? and 'data.frame':? ? ? ? 2 obs. of? 5 variables:
? .. ..$ Df? ? : num [1:2] 2 8
? .. ..$ Sum Sq : num [1:2] 14.9 4.4
? .. ..$ Mean Sq: num [1:2] 7.47 0.55
? .. ..$ F value: num [1:2] 13.6 NA
? .. ..$ Pr(>F) : num [1:2] 0.00268 NA
? *.. ..$ Thing? : num **0.772413*
? ..- attr(*, "class")= chr [1:2] "summary.aov" "listof"
Now, I know how to do this if I want to just add the variable to one
element at a time:
result[[1]][[1]]$Thing <- 0.5
But I can't figure out how to do it for every element at once (other than
using a for loop). I am able to index an existing variable from each
element of a list (using lapply or sapply, based on the examples from
http://stackoverflow.com/questions/1355355/how-to-avoid-a-loop-in-r-selecting-items-from-a-listand
http://tolstoy.newcastle.edu.au/R/help/05/05/4678.html), but I can't figure
out how to *set* a new variable for each element in a list. Does anyone
know how to do this?
Thank you,
Steve Polizer-Ahles
Stephen Politzer-Ahles University of Kansas Linguistics Department http://people.ku.edu/~sjpa/ ??? [[alternative HTML version deleted]] ______________________________________________ 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.
1 day later
An embedded and charset-unspecified text was scrubbed... Name: not available URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20121125/aec97b3c/attachment.pl>
HI Steve, You could try this: ylist<-lapply(y,function(x) x) ?res<-lapply(mapply(c,result,Thing=ylist,SIMPLIFY=FALSE),function(x) do.call(cbind,x)) ?res #$`Error: subject` ?# ??????? Df Sum Sq Mean Sq F value Pr(>F) Thing #Residuals? 4?? 12.4???? 3.1????? NA???? NA?? 0.5 #$`Error: subject:myfactor` ?# ??????? Df?? Sum Sq? Mean Sq? F value????? Pr(>F)???? Thing #myfactor?? 2 14.93333 7.466667 13.57576 0.002682772 0.7724138 #Residuals? 8? 4.40000 0.550000?????? NA????????? NA 0.7724138 #But, it removes the "*", which BTW gets removed by individually inserting as you showed. A.K.
From: Stephen Politzer-Ahles <politzerahless at gmail.com>
To: arun <smartpink111 at yahoo.com>
Cc: R help <r-help at r-project.org>
Sent: Sunday, November 25, 2012 8:35 PM
Subject: Re: [R] Adding a new variable to each element of a list
To: arun <smartpink111 at yahoo.com>
Cc: R help <r-help at r-project.org>
Sent: Sunday, November 25, 2012 8:35 PM
Subject: Re: [R] Adding a new variable to each element of a list
Hi Arun,
Thanks a lot for the help. I think I didn't make my request clear, though; sorry about that. What your example does is applies the values of y to each element in the list "result". However, what I'm actually trying to do is apply the nth element of y to the nth element of result. In other words, I'm trying to find a way in one command to do the equivalent of the following:
result[[1]][[1]]$Thing <- y[1]
result[[2]][[1]]$Thing <- y[2]
...etc.
Is this even possible? (Granted, for my purpose "result" is not a very long list, so it would not be difficult to just do those commands one at a time or in a for loop. At this point I'm just curious to figure out a more straightforward way to do it just for the sake of trying to learn more about how R works!)
If it helps put things into context, in my example the list "result" is a summary of an aov object, and each element in the list is one of the ANOVA effects; y is a vector of the partial eta squareds I calculated corresponding to each effect, and I'm trying to figure out a way to add those into the "result" object so it shows up when my colleague looks at the summary.
Best,
Steve
On Sat, Nov 24, 2012 at 5:22 PM, arun <smartpink111 at yahoo.com> wrote:
HI,
>
>The example data you gave have only one row for the 1st element of list.? So, it would be better to add it as:
>?lapply(result,function(x) {x[[2]]<-y
>?return(x)})
>#$`Error: subject`
>#Component 1 :
>?# ??????? Df Sum Sq Mean Sq F value Pr(>F)
>#Residuals? 4?? 12.4???? 3.1??????????????
>#
>#Component 2 :
>#[1] 0.5000000 0.7724138
>-----------------------------
>You can also do:
>?lapply(result,function(x) {x[[1]][6]<-y[1]
>?x[[1]][7]<-y[2]
>?return(x)})
>#$`Error: subject`
>?# ??????? Df Sum Sq Mean Sq F value Pr(>F)? V6???? V7
>#Residuals? 4?? 12.4???? 3.1??????????????? 0.5 0.7724
>
>#$`Error: subject:myfactor`
>?# ??????? Df Sum Sq Mean Sq F value?? Pr(>F)? V6???? V7
>#myfactor?? 2? 14.93?? 7.467?? 13.58 0.002683 0.5 0.7724
>#Residuals? 8?? 4.40?? 0.550????????????????? 0.5 0.7724??? #Here it got repeated
>
>May be there are better methods
>
>A.K.
>
>
>
>
>
>
>----- Original Message -----
>From: Stephen Politzer-Ahles <politzerahless at gmail.com>
>To: r-help at r-project.org
>Cc:
>Sent: Saturday, November 24, 2012 5:33 PM
>Subject: [R] Adding a new variable to each element of a list
>
>Hello,
>
>I have a list of data with multiple elements, and each element in the list
>has multiple variables in it. Here's an example:
>
>### Make the fake data
>dv <- c(1,3,4,2,2,3,2,5,6,3,4,4,3,5,6)
>subject <- factor(c("s1","s1","s1","s2","s2","s2","s3","s3","s3",
>"s4","s4","s4","s5","s5","s5"))
>myfactor <- factor(c("f1","f2","f3","f1","f2","f3","f1","f2","f3",
>"f1","f2","f3","f1","f2","f3"))
>mydata <- data.frame(dv, subject, myfactor)
>
>### Do the anova and store the summary in "result"
>mydata.aov <- aov( dv ~ myfactor + Error(subject/myfactor), mydata )
>( result <- summary( mydata.aov ) ) # see the anova
>
>str(result)
>
>List of 2
>$ Error: subject? ? ? ? ?:List of 1
>? ..$ :Classes ?anova? and 'data.frame':? ? ? ? 1 obs. of? 5 variables:
>? .. ..$ Df? ? ?: num 4
>? .. ..$ Sum Sq : num 12.4
>? .. ..$ Mean Sq: num 3.1
>? .. ..$ F value: num NA
>? .. ..$ Pr(>F) : num NA
>? ..- attr(*, "class")= chr [1:2] "summary.aov" "listof"
>$ Error: subject:myfactor:List of 1
>? ..$ :Classes ?anova? and 'data.frame':? ? ? ? 2 obs. of? 5 variables:
>? .. ..$ Df? ? ?: num [1:2] 2 8
>? .. ..$ Sum Sq : num [1:2] 14.9 4.4
>? .. ..$ Mean Sq: num [1:2] 7.47 0.55
>? .. ..$ F value: num [1:2] 13.6 NA
>? .. ..$ Pr(>F) : num [1:2] 0.00268 NA
>? ..- attr(*, "class")= chr [1:2] "summary.aov" "listof"
>
>As you can see, each element in "result" has several variables (Df, Sum Sq,
>Mean Sq, F value, Pr(>F)):
>str( result[[2]][[1]] )
>Classes ?anova? and 'data.frame':? ? ? ?2 obs. of? 5 variables:
>$ Df? ? ?: num? 2 8
>$ Sum Sq : num? 14.9 4.4
>$ Mean Sq: num? 7.47 0.55
>$ F value: num? 13.6 NA
>$ Pr(>F) : num? 0.00268 NA
>
>Now I also have another vector of numbers that I would like to add to the
>list, as a 6th variable for each element:
>y <- c(.5, .7724138)
>
>Ideally, I would like each element in the list ("Error: subject" and
>"Error: subject:myfactor") to have a 6th variable, so the new str() would
>look like:
>List of 2
>$ Error: subject? ? ? ? ?:List of 1
>? ..$ :Classes ?anova? and 'data.frame':? ? ? ? 1 obs. of? 5 variables:
>? .. ..$ Df? ? ?: num 4
>? .. ..$ Sum Sq : num 12.4
>? .. ..$ Mean Sq: num 3.1
>? .. ..$ F value: num NA
>? .. ..$ Pr(>F) : num NA
>* .. ..$ Thing? : num 0.50*
>
>? ..- attr(*, "class")= chr [1:2] "summary.aov" "listof"
>$ Error: subject:myfactor:List of 1
>? ..$ :Classes ?anova? and 'data.frame':? ? ? ? 2 obs. of? 5 variables:
>? .. ..$ Df? ? ?: num [1:2] 2 8
>? .. ..$ Sum Sq : num [1:2] 14.9 4.4
>? .. ..$ Mean Sq: num [1:2] 7.47 0.55
>? .. ..$ F value: num [1:2] 13.6 NA
>? .. ..$ Pr(>F) : num [1:2] 0.00268 NA
>? *.. ..$ Thing? : num **0.772413*
>
>? ..- attr(*, "class")= chr [1:2] "summary.aov" "listof"
>
>Now, I know how to do this if I want to just add the variable to one
>element at a time:
>result[[1]][[1]]$Thing <- 0.5
>
>But I can't figure out how to do it for every element at once (other than
>using a for loop). I am able to index an existing variable from each
>element of a list (using lapply or sapply, based on the examples from
>http://stackoverflow.com/questions/1355355/how-to-avoid-a-loop-in-r-selecting-items-from-a-listand
>http://tolstoy.newcastle.edu.au/R/help/05/05/4678.html), but I can't figure
>out how to *set* a new variable for each element in a list. Does anyone
>
>know how to do this?
>
>Thank you,
>Steve Polizer-Ahles
>
>--
>Stephen Politzer-Ahles
>University of Kansas
>Linguistics Department
>http://people.ku.edu/~sjpa/
>
>??? [[alternative HTML version deleted]]
>
>
>______________________________________________
>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.
>
>
Stephen Politzer-Ahles University of Kansas Linguistics Department http://people.ku.edu/~sjpa/
An embedded and charset-unspecified text was scrubbed... Name: not available URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20121126/09412138/attachment.pl>