简体   繁体   English

从两个data.frames创建列表列表的功能

[英]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. 我有两个data.frames firstdf和secondf,(下面的示例数据。)我正在尝试创建一个函数,该函数将输出类似下面的ExampleList数据的结果。 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. 我想创建一个列表列表,在该列表中,它从firstdf抓取第一行条目,并将它们的值放在exampleList的事物和测试字段中,然后从seconddf的另一个字段抓取前三个值,将它们连接在一起,然后保存它们放在exampleList的otherthing字段中,然后移至firstdf中的下一行,并移至seconddf中的下3行。 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 ). 你可以使用Map ,的多元版本lapply (与splitotherthing )。 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"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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