【问题标题】:Split all columns in one data frame and create two data frames in R拆分一个数据框中的所有列并在 R 中创建两个数据框
【发布时间】:2017-04-06 19:43:51
【问题描述】:

我有一个如下所示的数据框(我们称之为 df):

col1 <- c("1/10", "2/30", "1/40", "3/23", "0/17", "7/14")
col2 <- c("2/44", "0/13", "4/55", "6/43", "0/19", "2/34")
col3 <- c("0/36", "0/87", "3/11", "2/12", "4/33", "0/12")
col4 <- c("1/76", "2/65", "2/21", "5/0", "2/26", "1/52")

df <- data.frame(col1,col2,col3,col4)

目标:每个单元格中有两个数字,由“/”隔开。创建两个数据框:1 个数据框带有 LEFT 编号,另一个数据框带有 RIGHT 编号。

理想的最终结果应该是这样的:

df.left.numbers:

  col1 col2 col3 col4
  1    2    0    1
  2    0    0    2
  1    4    3    2
  3    6    2    5
  0    0    4    2
  7    2    0    1

df.right.numbers:

  col1 col2 col3 col4
  10   44   36   76
  30   13   87   65
  40   55   11   21
  23   43   12   0
  17   19   33   26
  14   34   12   53

我使用了 strsplit() 但那是在一个数据框中将 1 列分成两列。我还尝试了 tidyr 包中的 separate() 函数,但是它需要给定列的名称。我正在遍历所有这些。我想我可以写一个循环,但是我想知道是否有人有更简单的方法来实现这一点!

谢谢!!

【问题讨论】:

    标签: r dataframe strsplit


    【解决方案1】:

    试试这个:

    require(data.table)
    lapply(split(unlist(
             lapply(df,tstrsplit,"/"),recursive=FALSE),c("Left","Right")),
              as.data.frame)
    
    #$Right
    #  col12 col22 col32 col42
    #1    10    44    36    76
    #2    30    13    87    65
    #3    40    55    11    21
    #4    23    43    12     0
    #5    17    19    33    26
    #6    14    34    12    52
    
    #$Left
    #  col11 col21 col31 col41
    #1     1     2     0     1
    #2     2     0     0     2
    #3     1     4     3     2
    #4     3     6     2     5
    #5     0     0     4     2
    #6     7     2     0     1
    

    【讨论】:

      【解决方案2】:

      不是很优雅,但它很短而且很有效......

      col1 <- c("1/10", "2/30", "1/40", "3/23", "0/17", "7/14")
      col2 <- c("2/44", "0/13", "4/55", "6/43", "0/19", "2/34")
      col3 <- c("0/36", "0/87", "3/11", "2/12", "4/33", "0/12")
      col4 <- c("1/76", "2/65", "2/21", "5/0", "2/26", "1/52")
      
      df <- data.frame(col1,col2,col3,col4,stringsAsFactors = FALSE)
      
      dfLeft <- as.data.frame(lapply(df,function(x) gsub("\\/.+","",x)))
      dfRight <- as.data.frame(lapply(df,function(x) gsub(".+\\/","",x)))
      

      【讨论】:

        【解决方案3】:

        purrr 包的另一个选项:

        library(data.table)
        library(purrr)
        df %>% 
               map(tstrsplit, split="/") %>% 
               transpose() %>% map(as.data.frame) %>% 
               set_names(c("left", "right"))
        #$left
        #  col1 col2 col3 col4
        #1    1    2    0    1
        #2    2    0    0    2
        #3    1    4    3    2
        #4    3    6    2    5
        #5    0    0    4    2
        #6    7    2    0    1
        
        #$right
        #  col1 col2 col3 col4
        #1   10   44   36   76
        #2   30   13   87   65
        #3   40   55   11   21
        #4   23   43   12    0
        #5   17   19   33   26
        #6   14   34   12   52
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-09-30
          • 1970-01-01
          • 2020-11-15
          相关资源
          最近更新 更多