如何从R中的嵌套列表构建数据框

时间:2018-12-20 03:19:21

标签: r list lapply purrr

我有一个查询数据库并返回两个数据帧(df1和df2)的列表的函数。如果我对该函数进行迭代迭代,则会返回带有两个数据帧的嵌套列表的列表。

结果列表的结构如下:

Sub TextColorChange()

Dim xWs As Worksheet
Set xWs = Sheets("Trading Statistics")

For Row = 10 To 13

    vall = xWs.Cells(Row, 51).Value

        CheckPlus = InStr(1, vall, "+")
        CheckMinus = InStr(1, vall, "-")
        CheckDash = InStr(1, vall, "/")
        part = Len(vall) - CheckDash + 1

        If CheckMinus <> 0 Then
            xWs.Cells(Row, 51).Characters(Start:=CheckMinus, Length:=part).Font.ColorIndex = 3
        End If

        If CheckPlus <> 0 Then
            xWs.Cells(Row, 51).Characters(Start:=CheckPlus, Length:=part).Font.ColorIndex = 10
        End If

Next Row

End Sub
--------------------------------    
Private Sub Worksheet_Calculate()
    Dim Xrg As Range
    Set Xrg = Me.Range("AY6")
    If Not Intersect(Xrg, Me.Range("AY6")) Is Nothing Then
       Call TextColorChange
    End If
End Sub

然后,我想将数据帧组合到各自独立的大数据帧中-df1_All和df2_All。

如何从列表中提取所有df1数据帧并将它们组合成更大的数据帧?我想这是将do.call(rbind)构造与myList的apply或map函数一起使用吗?

3 个答案:

答案 0 :(得分:1)

根据罗纳克·沙(Ronak Shah)对我的问题的评论,这是我的回答:

dfX1 <- data.frame(do.call("rbind",lapply(myList,"[[","df1")))
dfX2 <- data.frame(do.call("rbind",lapply(myList,"[[","df2"))) 

答案 1 :(得分:0)

编辑:以下代码无法创建所需的输出(我起草此代码后,OP澄清了预期的输出)

让我们创建一个自定义函数。您的数据帧似乎位于同一位置,所以让我们利用这种规律性:

getDataFrame <- function(mylist, wantx) {
  df <- sapply(myList, `[[`, wantx)
  names(df) <- paste0("Name", seq(1:length(mylist)))
  df <- as_tibble(df)
  return(df)
}

所以

getDataFrame(myList, 1)

返回:

# A tibble: 3 x 3
  Name1 Name2 Name3
  <fct> <fct> <fct>
1 A     D     G    
2 B     E     H    
3 C     F     I 

类似地:

> getDataFrame(myList, 2)
# A tibble: 3 x 3
  Name1 Name2 Name3
  <fct> <fct> <fct>
1 1     4     7    
2 2     5     8    
3 3     6     9    

如果您不希望它们成为因素,则必须在之后进行转换。希望这会有所帮助。

答案 2 :(得分:0)

myList %>% 
   pmap(.,bind_rows) %>% 
   bind_cols()
  Value Value1
1     A      1
2     B      2
3     C      3
4     D      4
5     E      5
6     F      6
7     G      7
8     H      8
9     I      9