将数据框列表的每个元素的名称添加为列

时间:2019-06-15 08:00:42

标签: r list dataframe datatable

我有一个数据列表。在此列表中,它可以是数据表或数据帧。解决此问题后,我将绑定列表。

数据示例:

        case 'SET_START_DATE':
            return {
                ...state,
                startDate: action.startDate
            }
        case 'SET_END_DATE':
            return {
                ...state,
                endDate: action.endDate
            }

其余的省略。

如何为列表中的数据表名称分配值?

所需的输出:

players
$`0001playeraway`
      key NO        MIN 2PTM 2PTA 2PT(%) 3PTM 3PTA 3PT(%) FGM FGA FG(%) FTM FTA FT(%) OR DR REB AST TO STL BS PF
   1:   * 17   40:00:00    9   15     60    0    0      0   9  15    60   2   4    50  1  8   9   2  4   1  2  1
   2:   * 16   40:00:00    4    8     50    8   13     62  12  21    57  20  22    91  2  3   5   4  4   0  0  3
   3:   * 10   33:02:00    2    4     50    0    3      0   2   7    29   0   0     0  0  4   4   1  3   1  0  4
   4:   *  3   27:46:00    2    3     67    0    0      0   2   3    67   6   6   100  1  4   5   0  1   4  0  3
   5:      1   26:24:00    1    1    100    0    2      0   1   3    33   1   2    50  1  0   1   1  0   1  0  4

$`0102playeraway`
      key NO        MIN 2PTM 2PTA 2PT(%) 3PTM 3PTA 3PT(%) FGM FGA FG(%) FTM FTA FT(%) OR DR REB AST TO STL BS PF
   1:   *  9   40:00:00    1    3     33    2    7     29   3  10    30   3   4    75  1  4   5   8  1   4  1  3
   2:   * 53   38:18:00    6   14     43    0    0      0   6  14    43   6   8    75  5  3   8   3  4   0  2  5
   3:   * 13   35:16:00    3    8     38    1    2     50   4  10    40   2   5    40  1  3   4   5  0   0  0  5
   4:   * 23   31:42:00    2    7     29    2    8     25   4  15    27   7   7   100  1  7   8   1  1   0  0  2
   5:     14      22:08    2    3     67    2    4     50   4   7    57   0   0     0  0  2   2   2  1   0  0  1

3 个答案:

答案 0 :(得分:3)

您可以使用purrr::imapdplyr::mutate向列表中的所有数据框添加一列,并带有每个元素的名称。在这里,我还根据需要使用sringr::str_extract来获取名称的数字部分。

#some data to work with as an example:
df1 <- data.frame(x = 1:3, y=letters[1:3])
listdfs <- list("tr088text" = df1,"character963" = df1,"00123string" = df1)

library(tidyverse)

imap(listdfs, ~mutate(year = str_extract(.y, "\\-*\\d+\\.*\\d*") , .x))

#> $tr088text
#>   x y year
#> 1 1 a  088
#> 2 2 b  088
#> 3 3 c  088
#> 
#> $character963
#>   x y year
#> 1 1 a  963
#> 2 2 b  963
#> 3 3 c  963
#> 
#> $`00123string`
#>   x y  year
#> 1 1 a 00123
#> 2 2 b 00123
#> 3 3 c 00123

reprex package(v0.3.0)于2019-06-15创建

答案 1 :(得分:0)

由于您仍然打算绑定数据帧,因此可以通过将dplyr的{​​{1}}与参数bind_rows一起使用以将列表元素名称包括为新变量.id = "year"。使用数据:

year

您可以这样做:

library(data.table)

players <- list(`0001playeraway` = data.table(NO = 1:5),
                `0102playeraway` = data.table(NO = 6:10)
                )

哪个返回:

library(dplyr)

bind_rows(players, .id = "year")

如果您真的只想要数字,则可以使用 year NO 1 0001playeraway 1 2 0001playeraway 2 3 0001playeraway 3 4 0001playeraway 4 5 0001playeraway 5 6 0102playeraway 6 7 0102playeraway 7 8 0102playeraway 8 9 0102playeraway 9 10 0102playeraway 10 之类的东西,也可以将df$year <- sub("(\\d+).*", "\\1", df$year)的输出通过管道传送到bind_rows中,例如:

mutate

哪个返回:

bind_rows(players, .id = "year") %>%
    mutate(year = sub("(\\d+).*", "\\1", year))

请注意,这将返回 year NO 1 0001 1 2 0001 2 3 0001 3 4 0001 4 5 0001 5 6 0102 6 7 0102 7 8 0102 8 9 0102 9 10 0102 10 。如果您需要data.frame,只需将data.table的输出通过管道传输到mutate

答案 2 :(得分:0)

您可以使用Map在简单的substr中进行此操作;无需其他软件包。

L将作为data.framedata.table s混合列表的示例:

L
# $`0001playeraway`
# X1 X2 X3 X4
# 1  1  4  7 10
# 2  2  5  8 11
# 3  3  6  9 12
# 
# $`0102playeraway`
# X1 X2 X3 X4
# 1  1  4  7 10
# 2  2  5  8 11
# 3  3  6  9 12
# 
# $`1003playeraway`
# X1 X2 X3 X4
# 1:  1  4  7 10
# 2:  2  5  8 11
# 3:  3  6  9 12

方法:

library(data.table)
dat <- do.call(rbind, Map(function(x) cbind(year=substr(names(L)[x], 1, 4), L[[x]]), seq(L)))
dat
#    year X1 X2 X3 X4
# 1: 0001  1  4  7 10
# 2: 0001  2  5  8 11
# 3: 0001  3  6  9 12
# 4: 0102  1  4  7 10
# 5: 0102  2  5  8 11
# 6: 0102  3  6  9 12
# 7: 1003  1  4  7 10
# 8: 1003  2  5  8 11
# 9: 1003  3  6  9 12

由于data.table是整个过程的主导,因此,如果以后需要dat <- as.data.frame(dat),请执行data.frame

数据

L <- list(`0001playeraway` = structure(list(X1 = 1:3, X2 = 4:6, X3 = 7:9, 
    X4 = 10:12), class = "data.frame", row.names = c(NA, -3L)), 
    `0102playeraway` = structure(list(X1 = 1:3, X2 = 4:6, X3 = 7:9, 
        X4 = 10:12), class = "data.frame", row.names = c(NA, 
    -3L)), `1003playeraway` = structure(list(X1 = 1:3, X2 = 4:6, 
        X3 = 7:9, X4 = 10:12), class = c("data.table", "data.frame"
    ), row.names = c(NA, -3L)))