代码之家  ›  专栏  ›  技术社区  ›  Banjo

使列具有列值

r
  •  0
  • Banjo  · 技术社区  · 7 年前

    我有这样的数据:

    view(S)
    # A tibble: 10 x 1
       Source                
       <chr>                 
     1 137                   
     2 137,111,43,34,34,43,22
     3 137                   
     4 137                   
     5 137,45,34,63,34,45,22 
     6 137,78,63             
     7 137.63                
     8 137                   
     9 137,83,78             
    10 137,132,128   
    

    我想将每个不同的值作为它自己的列,如果该值出现在一行中,则该值应为x,否则不应插补任何值。

      137 111 43 ...
    1   x           
    2   x   x  x
    3   x
    4   x
    5   x
    ...
    

    separate 函数,然后将所有非NA的值替换为x:

    library(tidyr)
    separate(S, col = "Source", into = c("137", "111", "43"), sep = ",")
    
    
     # A tibble: 10 x 3
       x      Y     Z    
       <chr>  <chr> <chr>
     1 137    NA    NA   
     2 137    111   43   
     3 137    NA    NA   
     4 137    NA    NA   
     5 137    45    34   
     6 137    78    63   
     7 137.63 NA    NA   
     8 137    NA    NA   
     9 137    83    78   
    10 137    132   128  
    

    然而,实际上,不同数字的数量要比示例中大得多。

    structure(list(Source = c("137", "137,111,43,34,34,43,22", "137", 
    "137", "137,45,34,63,34,45,22", "137,78,63", "137.63", "137", 
    "137,83,78", "137,132,128")), row.names = c(NA, -10L), class = c("tbl_df", 
    "tbl", "data.frame"))
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Rui Barradas    7 年前

    也许下面的内容可以满足你的需要。
    只需从中获取所有唯一值 S 并以此作为论据 into

    into <- unique(unlist(strsplit(S[[1]], ",")))
    separate(S, col = "Source", into = into, sep = ",")