简体   繁体   中英

Function to create list of list from two data.frames

I have two data.frames firstdf and secondf, (example data below.) I'm trying to create a function that would output results like the ExampleList data I have below. I want to create a list of lists, where it grabs the first row entries from firstdf and puts their values in the thing and test fields in exampleList, then grabs the first 3 values from the otherthing field in seconddf, concatenates them together, and saves them in the otherthing field in exampleList, then moves on to the next row in firstdf and the next 3 rows in seconddf. Loops are a little tricky for me, so tips are definitely appreciated.

data:

dput(firstdf)
structure(list(thing = structure(1:3, .Label = c("thing1", "thing2", 
"thing3"), class = "factor"), test = structure(1:3, .Label = c("test1", 
"test2", "test3"), class = "factor")), .Names = c("thing", "test"
), row.names = c(NA, -3L), class = "data.frame")

dput(seconddf)
    structure(list(otherthing = structure(c(4L, 5L, 6L, 7L, 8L, 9L, 
    1L, 2L, 3L), .Label = c("thing10", "thing11", "thing12", "thing4", 
    "thing5", "thing6", "thing7", "thing8", "thing9"), class = "factor"), 
        other = structure(c(9L, 6L, 7L, 2L, 3L, 1L, 8L, 4L, 5L), .Label = c("fads", 
        "oiu", "qwer", "rewa", "rewq", "sfas", "sfwg", "tre", "xdfs"
        ), class = "factor")), .Names = c("otherthing", "other"), row.names = c(NA, 
    -9L), class = "data.frame")

And output:

 dput(ExampleList)
list(structure(list(thing = "thing1", test = "test1", otherthing = c("thing4", 
"thing5", "thing6")), .Names = c("thing", "test", "otherthing"
)), structure(list(thing = "thing2", test = "test2", otherthing = c("thing7", 
"thing8", "thing9")), .Names = c("thing", "test", "otherthing"
)), structure(list(thing = "thing3", test = "test3", otherthing = c("thing10", 
"thing11", "thing12")), .Names = c("thing", "test", "otherthing"
)))
[[1]]
[[1]]$thing
[1] "thing1"

[[1]]$test
[1] "test1"

[[1]]$otherthing
[1] "thing4" "thing5" "thing6"


[[2]]
[[2]]$thing
[1] "thing2"

[[2]]$test
[1] "test2"

[[2]]$otherthing
[1] "thing7" "thing8" "thing9"


[[3]]
[[3]]$thing
[1] "thing3"

[[3]]$test
[1] "test3"

[[3]]$otherthing
[1] "thing10" "thing11" "thing12"

You could use Map , the multivariate version of lapply (with split for otherthing ). The first parameter is a function to applied to multiple parameters that will be iterated on in parallel, so

ExampleList <- Map(list, 
    thing = as.character(firstdf$thing), 
    test = as.character(firstdf$test), 
    otherthing = split(as.character(seconddf[[1]]), rep(1:3, each = 3)))

str(ExampleList)

## List of 3
##  $ thing1:List of 3
##   ..$ thing     : chr "thing1"
##   ..$ test      : chr "test1"
##   ..$ otherthing: chr [1:3] "thing4" "thing5" "thing6"
##  $ thing2:List of 3
##   ..$ thing     : chr "thing2"
##   ..$ test      : chr "test2"
##   ..$ otherthing: chr [1:3] "thing7" "thing8" "thing9"
##  $ thing3:List of 3
##   ..$ thing     : chr "thing3"
##   ..$ test      : chr "test3"
##   ..$ otherthing: chr [1:3] "thing10" "thing11" "thing12"

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM