Re: Convert R object to a data frame
"Sorkin, John" <[email protected]> Fri, 5 Jun 2026 00:25:56 +0000
| Newsgroups | gmane.comp.lang.r.general |
|---|---|
| Message-ID | <DM6PR03MB50493505F731A6CEA5B694E9E2112@DM6PR03MB5049.namprd03.prod.outlook.com> |
Avi, The code generates data for each day of observation. For each day I want to= generate the number of subjects exposed to a value at, or above, a toxic c= utpoint. The table below shows an example of the information I want to capt= ure. The format of the output is of minor importance. What is important is = that I get the data from my code. Once I get the data I can work on formatt= ing it so it looks nice. Date Variable Cutpoint 1/2/2020 Cutpoint Value 0.1 0.2 0.3 0.4 1/2/2020 Number of Subjects 100 50 10 2 1/3/2020 Cutpoint Value 0.1 0.2 0.3 0.4 1/3/2020 Number of Subjects 34 22 11 0 1/4/2020 Cutpoint Value 0.1 0.2 0.3 0.4 1/4/2020 Number of Subjects 200 70 340 40 The table would look better if I could send this email in html format, but = I believe R help will reject formatted email. Thank you, John John David Sorkin M.D., Ph.D. Professor of Medicine, University of Maryland School of Medicine; Associate Director for Biostatistics and Informatics, Baltimore VA Medical = Center Geriatrics Research, Education, and Clinical Center; Former PI Biostatistics and Informatics Core, University of Maryland School= of Medicine Claude D. Pepper Older Americans Independence Center; Senior Statistician University of Maryland Center for Vascular Research; Division of Gerontology, Geriatrics and Palliative Medicine, 10 North Greene Street GRECC (BT/18/GR) Baltimore, MD 21201-1524 Cell phone 443-418-5382 ________________________________________ From: [email protected] <[email protected]> Sent: Thursday, June 4, 2026 6:30 PM To: 'Rui Barradas'; Sorkin, John; 'R-help' Subject: RE: [R] Convert R object to a data frame It would help, John, if we understood what the resultant data.frame should = look like. The structure looks like it contains nested lists including a list of 4 con= taining 4 lists of 2. The contents range from int to num. In a standard data.frame, you might want eight columns per row and would en= d up with four rows. You can now make data.frames CAREFULLY in which a column can contain someth= ing complex such as a list or the output of a statistical function. So, fou= r columns each containing a list of 2 columns can be done. Since you have a very specific data structure in mind, conversions could be= straightforward or not. Here is a simpleminded attempt to replicate your first structure to generat= e one row that unexpectedly does something a bit different: myRow <- data.frame( alpha =3D list(criticalvalue=3D0.1, NumPeopleExposed=3D0), beta =3D list(criticalvalue=3D0.2, NumPeopleExposed=3D0), gamma =3D list(criticalvalue=3D0.3, NumPeopleExposed=3D0), delta =3D list(criticalvalue=3D0.4, NumPeopleExposed=3D0) ) Note you could have initialized this from the other data structure by putti= ng in references to those values instead of my constants BUT the goal was t= o see what it made and, well, it is not as expected: > myRow alpha.criticalvalue alpha.NumPeopleExposed beta.criticalvalue beta.NumPeo= pleExposed gamma.criticalvalue 1 0.1 0 0.2 = 0 0.3 gamma.NumPeopleExposed delta.criticalvalue delta.NumPeopleExposed 1 0 0.4 0 > nrow(myRow) [1] 1 > ncol(myRow) [1] 8 > names(myRow) [1] "alpha.criticalvalue" "alpha.NumPeopleExposed" "beta.criticalvalue" = "beta.NumPeopleExposed" [5] "gamma.criticalvalue" "gamma.NumPeopleExposed" "delta.criticalvalue"= "delta.NumPeopleExposed" You need to protect a sub-list from base R with something like the I() func= tion: Is this version better? myRow <- data.frame( alpha =3D I(list(criticalvalue=3D0.1, NumPeopleExposed=3D0)), beta =3D I(list(criticalvalue=3D0.2, NumPeopleExposed=3D0)), gamma =3D I(list(criticalvalue=3D0.3, NumPeopleExposed=3D0)), delta =3D I(list(criticalvalue=3D0.4, NumPeopleExposed=3D0)) ) > myRow alpha beta gamma delta criticalvalue 0.1 0.2 0.3 0.4 NumPeopleExposed 0 0 0 0 > nrow(myRow) [1] 2 > ncol(myRow) [1] 4 > names(myRow) [1] "alpha" "beta" "gamma" "delta" Well, my one row now seems to be two rows with four per row. > myRow$alpha $criticalvalue [1] 0.1 $NumPeopleExposed [1] 0 > myRow$alpha$criticalvalue [1] 0.1 > myRow$alpha$NumPeopleExposed [1] 0 This seems to get you some of what you want. Something may be off as it sho= uld not be two rows. I would suggest you can possibly find a solution in base R but my experienc= e has been using various tidyverse functions as in dplyr to construct and u= se these embedded things. Do note the above are examples of making a single row and as mentioned, you= may want to combine multiple ones using various techniques such as rbind a= nd cbind. -----Original Message----- From: R-help <[email protected]> On Behalf Of Rui Barradas via R= -help Sent: Thursday, June 4, 2026 5:19 PM To: Sorkin, John <[email protected]>; R-help <[email protected]> Subject: Re: [R] Convert R object to a data frame =C0s 21:57 de 04/06/2026, Sorkin, John escreveu: > I have an R object created lapply function within a by a by function > > results_by_date <- by( > data, > data[,"Date"], > function(subdata) { > lapply( > alertlevels, > check_cutpoints2, > data=3Dsubdata, > mycolumn=3Dcolumn > ) > } > ) > > which has the following structure > > $ 2020-08-14:List of 4 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.1 > .. ..$ NumPeopleExposed: int 0 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.2 > .. ..$ NumPeopleExposed: int 0 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.3 > .. ..$ NumPeopleExposed: int 0 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.4 > .. ..$ NumPeopleExposed: int 0 > $ 2020-08-15:List of 4 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.1 > .. ..$ NumPeopleExposed: int 1 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.2 > .. ..$ NumPeopleExposed: int 0 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.3 > .. ..$ NumPeopleExposed: int 0 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.4 > .. ..$ NumPeopleExposed: int 0 > $ 2020-08-16:List of 4 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.1 > .. ..$ NumPeopleExposed: int 15 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.2 > .. ..$ NumPeopleExposed: int 6 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.3 > .. ..$ NumPeopleExposed: int 6 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.4 > .. ..$ NumPeopleExposed: int 6 > $ 2020-08-17:List of 4 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.1 > .. ..$ NumPeopleExposed: int 58 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.2 > .. ..$ NumPeopleExposed: int 20 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.3 > .. ..$ NumPeopleExposed: int 7 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.4 > .. ..$ NumPeopleExposed: int 2 > $ 2020-08-18:List of 4 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.1 > .. ..$ NumPeopleExposed: int 79 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.2 > .. ..$ NumPeopleExposed: int 45 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.3 > .. ..$ NumPeopleExposed: int 16 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.4 > .. ..$ NumPeopleExposed: int 6 > $ 2020-08-19:List of 4 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.1 > .. ..$ NumPeopleExposed: int 187 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.2 > .. ..$ NumPeopleExposed: int 100 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.3 > .. ..$ NumPeopleExposed: int 61 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.4 > .. ..$ NumPeopleExposed: int 38 > $ 2020-08-20:List of 4 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.1 > .. ..$ NumPeopleExposed: int 121 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.2 > .. ..$ NumPeopleExposed: int 31 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.3 > .. ..$ NumPeopleExposed: int 13 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.4 > .. ..$ NumPeopleExposed: int 4 > $ 2020-08-21:List of 4 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.1 > .. ..$ NumPeopleExposed: int 17 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.2 > .. ..$ NumPeopleExposed: int 8 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.3 > .. ..$ NumPeopleExposed: int 5 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.4 > .. ..$ NumPeopleExposed: int 3 > $ 2020-08-22:List of 4 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.1 > .. ..$ NumPeopleExposed: int 35 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.2 > .. ..$ NumPeopleExposed: int 12 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.3 > .. ..$ NumPeopleExposed: int 6 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.4 > .. ..$ NumPeopleExposed: int 2 > $ 2020-08-23:List of 4 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.1 > .. ..$ NumPeopleExposed: int 32 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.2 > .. ..$ NumPeopleExposed: int 15 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.3 > .. ..$ NumPeopleExposed: int 8 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.4 > .. ..$ NumPeopleExposed: int 4 > $ 2020-08-24:List of 4 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.1 > .. ..$ NumPeopleExposed: int 15 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.2 > .. ..$ NumPeopleExposed: int 5 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.3 > .. ..$ NumPeopleExposed: int 1 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.4 > .. ..$ NumPeopleExposed: int 0 > $ 2020-08-25:List of 4 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.1 > .. ..$ NumPeopleExposed: int 43 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.2 > .. ..$ NumPeopleExposed: int 26 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.3 > .. ..$ NumPeopleExposed: int 13 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.4 > .. ..$ NumPeopleExposed: int 5 > $ 2020-08-26:List of 4 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.1 > .. ..$ NumPeopleExposed: int 0 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.2 > .. ..$ NumPeopleExposed: int 0 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.3 > .. ..$ NumPeopleExposed: int 0 > ..$ :List of 2 > .. ..$ criticalvalue : num 0.4 > .. ..$ NumPeopleExposed: int 0 > - attr(*, "dim")=3D int 13 > - attr(*, "dimnames")=3DList of 1 > ..$ data[, "Date"]: chr [1:13] "2020-08-14" "2020-08-15" "2020-08-16" = "2020-08-17" ... > - attr(*, "call")=3D language by.data.frame(data =3D data, INDICES =3D = data[, "Date"], FUN =3D function(subdata) { lapply(alertlevels, check_c= utp| __truncated__ ... > - attr(*, "class")=3D chr "by" > NULL > > I would like to convert the object to a dataframe. Can anyone suggest how= I might accomplish this task? > > Thank you, > John > > John David Sorkin M.D., Ph.D. > Professor of Medicine, University of Maryland School of Medicine; > Associate Director for Biostatistics and Informatics, Baltimore VA Medica= l Center Geriatrics Research, Education, and Clinical Center; > Former PI Biostatistics and Informatics Core, University of Maryland Scho= ol of Medicine Claude D. Pepper Older Americans Independence Center; > Senior Statistician University of Maryland Center for Vascular Research; > > Division of Gerontology, Geriatrics and Palliative Medicine, > 10 North Greene Street > GRECC (BT/18/GR) > Baltimore, MD 21201-1524 > Cell phone 443-418-5382 > > > > ______________________________________________ > [email protected] mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide https://www.r-project.org/posting-guide.= html > and provide commented, minimal, self-contained, reproducible code. Hello, The problem is that you have a lapply() nested in by(), so you will have to rbind twice. It seems that results_by_date <- by( data, data[,"Date"], function(subdata) { lapply( alertlevels, check_cutpoints2, data=3Dsubdata, mycolumn=3Dcolumn ) |> do.call(rbind, args =3D _) } ) |> do.call(rbind, args =3D _) can solve it. Can you post the output of dput(results_by_date[1:2]) ? Hope this helps, Rui Barradas ______________________________________________ [email protected] mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide https://www.r-project.org/posting-guide.ht= ml and provide commented, minimal, self-contained, reproducible code.