【问题标题】:Create single objects form a table containing them [duplicate]从包含它们的表中创建单个对象[重复]
【发布时间】:2019-08-10 02:52:19
【问题描述】:

这是我对 R 的问题:

我有一个类似这样的表:

TABLE_NAME          COLUM_NAME          DATA_TYPE 
table_1               DATA              DATE
table_1               NAME              VARCHAR2
table_1               SURNAME           VARCHAR2
table_2               DATA              DATE
table_2               PACK              NUMBER

我想要做的是根据 TABLE_NAME 值创建 2 个不同的表,该值将以 TABLE_NAME 作为名称。 像这样

table_1

COLUM_NAME          DATA_TYPE 
   DATA              DATE
   NAME              VARCHAR2
   SURNAME           VARCHAR2

table_2

COLUM_NAME          DATA_TYPE
DATA              DATE
PACK              NUMBER

这样我可以创建我的表目录、同义词和数据库视图(使用 ROracle 无法从连接中获取此类元数据)。

我怎样才能做到这一点?

【问题讨论】:

    标签: r roracle


    【解决方案1】:

    dplyr你也可以试试:

    df %>%
     group_split(TABLE_NAME)
    
    [[1]]
    # A tibble: 3 x 3
      TABLE_NAME COLUM_NAME DATA_TYPE
      <chr>      <chr>      <chr>    
    1 table_1    DATA       DATE     
    2 table_1    NAME       VARCHAR2 
    3 table_1    SURNAME    VARCHAR2 
    
    [[2]]
    # A tibble: 2 x 3
      TABLE_NAME COLUM_NAME DATA_TYPE
      <chr>      <chr>      <chr>    
    1 table_2    DATA       DATE     
    2 table_2    PACK       NUMBER 
    

    【讨论】:

    • @zx8754 我认为保留它对将来寻找此功能的人会有所帮助。
    【解决方案2】:

    tidyverse 你可以filter 他们使用select 删除第一列:

    table1 <- df %>%
      filter(TABLE_NAME == "table_1") %>% 
      select(-TABLE_NAME)
    
    table2 <- df %>%
      filter(TABLE_NAME == "table_2") %>% 
      select(-TABLE_NAME)
    

    您也可以在一个函数中处理大量数据帧:

    table_fun <- function(x) {
      df %>%
        filter(TABLE_NAME == x) %>%
        select(-TABLE_NAME)
    }
    
    table_2 <- table_fun("table_2")
    
    # A tibble: 2 x 2
      COLUM_NAME DATA_TYPE
      <chr>      <chr>    
    1 DATA       DATE     
    2 PACK       NUMBER 
    

    【讨论】:

    • 想象一下 TABLE_NAME 列中的值超过 2 个。
    【解决方案3】:

    我们可以使用split 来创建listdata.frames

    lst1 <- split(df1[-1], df1[[1]])
    lst1
    #$table_1
    #  COLUM_NAME DATA_TYPE
    #1       DATA      DATE
    #2       NAME  VARCHAR2
    #3    SURNAME  VARCHAR2
    
    #$table_2
    #  COLUM_NAME DATA_TYPE
    #4       DATA      DATE
    #5       PACK    NUMBER
    

    这里,split 正在根据提供的因子拆分 data.frame(f in split)。它在“TABLE_NAME”中查找具有相同元素的行并将它们组合在一起并返回这些相似行的list

    【讨论】:

    • 感谢这正是我正在搜索的内容。你能解释一下这是如何工作的吗?谢谢
    • 谢谢完美,可以用多个变量分组吗?
    • @RevivedPicard 是的,您可以将df1[c("grp1", "grp2")] 指定为f 并删除未使用的组合drop = TRUE
    猜你喜欢
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 2016-10-31
    • 1970-01-01
    • 2019-10-06
    相关资源
    最近更新 更多