Keith Larson
2011-Dec-27 21:05 UTC
[R] How to create a loop and then extract values from the list generated by cor.test
Dear all, I would like to conduct a Pearson's correlation using cor.test separately for each individual in my data set. Each individual has nine observations of the measurement variable 'Delta13C'. I can figure our how to do it manually one 'Individual_ID' at a time, but I cannot figure out how to automate the process (a loop I am guessing). In addition, I would like to generate a new data frame that has the each individual's 'Individual_ID', the pearson correlation 'estimate', and the 'p.valve'. The output table would look something like: Individual_ID, estimate, p.value WW_08A_02, -0.7670675, 0.01586 WW_08A_03, -0.02320767, 0.9527 Code with sample data: ## Create sample dataset WW_Wing_SI <- structure(list(Individual_ID = c("WW_08A_02", "WW_08A_02", "WW_08A_02", "WW_08A_02", "WW_08A_02", "WW_08A_02", "WW_08A_02", "WW_08A_02", "WW_08A_02", "WW_08A_03", "WW_08A_03", "WW_08A_03", "WW_08A_03", "WW_08A_03", "WW_08A_03", "WW_08A_03", "WW_08A_03", "WW_08A_03" ), FeatherPosition = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9), Delta13C = c(-18.67, -19.16, -20.38, -20.96, -21.61, -21.65, -21.31, -20.8, -21.28, -20.06, -20.3, -21.21, -22.9, -22.87, -21.13, -20.68, -20.58, -20.69)), .Names = c("Individual_ID", "FeatherPosition", "Delta13C"), row.names = c(NA, 18L), class = "data.frame") ## Create vector with unique individual IDs WW_Wing_Individuals <- unique(WW_Wing_SI$Individual_ID) ## Create temp dataset with for the first individual temp <- WW_Wing_SI_Spring[ which(WW_Wing_SI_Spring$Individual_ID =WW_Wing_Individuals[1]), ] ## Create temp2 dateset with results of pearsons product-moment correlation (for the first individual) temp2 <- cor.test(temp$Delta13C, temp$FeatherPosition, method="pearson") Many Cheers, Keith ******************************************************************************************* Keith Larson, PhD Student Evolutionary Ecology, Lund University S?lvegatan 37 223 62 Lund Sweden Phone: +46 (0)46 2229014 Mobile: +46 (0)73 0465016 Fax: +46 (0)46 2224716 Skype: sternacaspia FB: keith.w.larson at gmail.com
Jean V Adams
2011-Dec-27 21:41 UTC
[R] How to create a loop and then extract values from the list generated by cor.test
Keith Larson wrote on 12/27/2011 03:05:48 PM:> Dear all, > > I would like to conduct a Pearson's correlation using cor.test > separately for each individual in my data set. Each individual has > nine observations of the measurement variable 'Delta13C'. I can figure > our how to do it manually one 'Individual_ID' at a time, but I cannot > figure out how to automate the process (a loop I am guessing). In > addition, I would like to generate a new data frame that has the each > individual's 'Individual_ID', the pearson correlation 'estimate', and > the 'p.valve'. > > The output table would look something like: > > Individual_ID, estimate, p.value > WW_08A_02, -0.7670675, 0.01586 > WW_08A_03, -0.02320767, 0.9527 > > Code with sample data: > > ## Create sample dataset > WW_Wing_SI <- > structure(list(Individual_ID = c("WW_08A_02", "WW_08A_02", "WW_08A_02", > "WW_08A_02", "WW_08A_02", "WW_08A_02", "WW_08A_02", "WW_08A_02", > "WW_08A_02", "WW_08A_03", "WW_08A_03", "WW_08A_03", "WW_08A_03", > "WW_08A_03", "WW_08A_03", "WW_08A_03", "WW_08A_03", "WW_08A_03" > ), FeatherPosition = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, > 5, 6, 7, 8, 9), Delta13C = c(-18.67, -19.16, -20.38, -20.96, > -21.61, -21.65, -21.31, -20.8, -21.28, -20.06, -20.3, -21.21, > -22.9, -22.87, -21.13, -20.68, -20.58, -20.69)), .Names =c("Individual_ID",> "FeatherPosition", "Delta13C"), row.names = c(NA, 18L), class ="data.frame")> > > ## Create vector with unique individual IDs > WW_Wing_Individuals <- unique(WW_Wing_SI$Individual_ID) > > ## Create temp dataset with for the first individual > temp <- WW_Wing_SI_Spring[ which(WW_Wing_SI_Spring$Individual_ID => WW_Wing_Individuals[1]), ] > > ## Create temp2 dateset with results of pearsons product-moment > correlation (for the first individual) > temp2 <- cor.test(temp$Delta13C, temp$FeatherPosition, method="pearson") > > Many Cheers, > Keith > >*******************************************************************************************> Keith Larson, PhD Student > Evolutionary Ecology, Lund University > Sölvegatan 37 > 223 62 Lund Sweden > Phone: +46 (0)46 2229014 Mobile: +46 (0)73 0465016 Fax: +46 (0)462224716> Skype: sternacaspia FB: keith.w.larson@gmail.com# split your data frame according the the individual IDs wing.list <- split(WW_Wing_SI, WW_Wing_SI$Individual_ID) # then apply cor.test() with extract to each element of the list t(sapply(wing.list, function(temp) cor.test(temp$Delta13C, temp$FeatherPosition, method="pearson")[c("estimate", "p.value")])) Jean [[alternative HTML version deleted]]
Jean V Adams
2011-Dec-28 13:53 UTC
[R] How to create a loop and then extract values from the list generated by cor.test
keith.w.larson@gmail.com wrote on 12/27/2011 04:06:09 PM:> Jean, > > Thanks! I am new to the list and R so I am unsure of the protocol for > replying to a reply.In general, cc R-help so that the entire thread of communication is available to everyone> Your code is simple and elegant. I understand > most of it, but I do not understand what is happening in the 'sapply' > portion of your code.read ?sapply lapply(X) returns a list of the same length as X, each element of which is the result of applying FUN to the corresponding element of X. sapply(X) is a user-friendly version and wrapper of lapply(X) by default returning a vector, matrix ...> Second, I know I can create a dataframe from the > results by: > > wing.pearson <- t(sapply(wing.list, function(temp) > cor.test(temp$Delta13C, > temp$FeatherPosition, > method="pearson")[c("estimate", > "p.value")])) > > but when I do this I get the Individual_ID's as row labels, not as a > variable 'Individual_ID' in my new data frame. Any suggestions?Actually, the results are in a matrix. Use the data.frame() function to convert the matrix to a data frame. Then add a new column with the IDs if you like. wing.list <- split(WW_Wing_SI, WW_Wing_SI$Individual_ID) wing.pearson <- data.frame(t(sapply(wing.list, function(temp) cor.test(temp$Delta13C, temp$FeatherPosition, method="pearson")[c("estimate", "p.value")]))) wing.pearson$Individual_ID <- dimnames(wing.pearson)[[1]] wing.pearson> Many Thanks!You're welcome. Jean> Keith > > > On Tue, Dec 27, 2011 at 10:41 PM, Jean V Adams <jvadams@usgs.gov> wrote: > > > > Keith Larson wrote on 12/27/2011 03:05:48 PM: > > > > > >> Dear all, > >> > >> I would like to conduct a Pearson's correlation using cor.test > >> separately for each individual in my data set. Each individual has > >> nine observations of the measurement variable 'Delta13C'. I canfigure> >> our how to do it manually one 'Individual_ID' at a time, but I cannot > >> figure out how to automate the process (a loop I am guessing). In > >> addition, I would like to generate a new data frame that has the each > >> individual's 'Individual_ID', the pearson correlation 'estimate', and > >> the 'p.valve'. > >> > >> The output table would look something like: > >> > >> Individual_ID, estimate, p.value > >> WW_08A_02, -0.7670675, 0.01586 > >> WW_08A_03, -0.02320767, 0.9527 > >> > >> Code with sample data: > >> > >> ## Create sample dataset > >> WW_Wing_SI <- > >> structure(list(Individual_ID = c("WW_08A_02", "WW_08A_02","WW_08A_02",> >> "WW_08A_02", "WW_08A_02", "WW_08A_02", "WW_08A_02", "WW_08A_02", > >> "WW_08A_02", "WW_08A_03", "WW_08A_03", "WW_08A_03", "WW_08A_03", > >> "WW_08A_03", "WW_08A_03", "WW_08A_03", "WW_08A_03", "WW_08A_03" > >> ), FeatherPosition = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, > >> 5, 6, 7, 8, 9), Delta13C = c(-18.67, -19.16, -20.38, -20.96, > >> -21.61, -21.65, -21.31, -20.8, -21.28, -20.06, -20.3, -21.21, > >> -22.9, -22.87, -21.13, -20.68, -20.58, -20.69)), .Names > >> c("Individual_ID", > >> "FeatherPosition", "Delta13C"), row.names = c(NA, 18L), class > >> "data.frame") > >> > >> > >> ## Create vector with unique individual IDs > >> WW_Wing_Individuals <- unique(WW_Wing_SI$Individual_ID) > >> > >> ## Create temp dataset with for the first individual > >> temp <- WW_Wing_SI_Spring[ which(WW_Wing_SI_Spring$Individual_ID => >> WW_Wing_Individuals[1]), ] > >> > >> ## Create temp2 dateset with results of pearsons product-moment > >> correlation (for the first individual) > >> temp2 <- cor.test(temp$Delta13C, temp$FeatherPosition,method="pearson")> >> > >> Many Cheers, > >> Keith > >> > >> > >> > >> Keith Larson, PhD Student > >> Evolutionary Ecology, Lund University > >> Sölvegatan 37 > >> 223 62 Lund Sweden > >> Phone: +46 (0)46 2229014 Mobile: +46 (0)73 0465016 Fax: +46 (0)462224716> >> Skype: sternacaspia FB: keith.w.larson@gmail.com > > > > > > # split your data frame according the the individual IDs > > wing.list <- split(WW_Wing_SI, WW_Wing_SI$Individual_ID) > > > > # then apply cor.test() with extract to each element of the list > > t(sapply(wing.list, function(temp) > > cor.test(temp$Delta13C, temp$FeatherPosition, > > method="pearson")[c("estimate", "p.value")])) > > > > Jean[[alternative HTML version deleted]]
Maybe Matching Threads
- convert variable types when creating data frame from cor.test results
- calculating correlation coefficients on repeated measures
- Identifying records with the correct number of repeated measures
- Subsetting without partial matches
- doing zero inflated glmm for count data with fmr