【问题标题】:Unnest (seperate) multiple column values into new rows using Sparklyr使用 Sparklyr 将多个列值取消嵌套(单独)到新行中
【发布时间】:2018-07-19 06:42:00
【问题描述】:

我正在尝试将用逗号(,)分隔的列值拆分为基于 id 的新行。我知道如何在 R 中使用 dplyrtidyr 做到这一点。但我希望在 sparklyr 中解决同样的问题。

id <- c(1,1,1,1,1,2,2,2,3,3,3)
name <- c("A,B,C","B,F","C","D,R,P","E","A,Q,W","B,J","C","D,M","E,X","F,E")
value <- c("1,2,3","2,4,43,2","3,1,2,3","1","1,2","26,6,7","3,3,4","1","1,12","2,3,3","3")
dt <- data.frame(id,name,value)

R 解决方案:

separate_rows(dt, name, sep=",") %>%
  separate_rows(value, sep=",")

来自 sparkframe(sparklyr 包)的所需输出-

> final_result
   id name value
1   1    A     1
2   1    A     2
3   1    A     3
4   1    B     1
5   1    B     2
6   1    B     3
7   1    C     1
8   1    C     2
9   1    C     3
10  1    B     2
11  1    B     4
12  1    B    43
13  1    B     2
14  1    F     2
15  1    F     4
16  1    F    43
17  1    F     2
18  1    C     3
19  1    C     1
20  1    C     2
21  1    C     3
22  1    D     1
23  1    R     1
24  1    P     1
25  1    E     1
26  1    E     2
27  2    A    26
28  2    A     6
29  2    A     7
30  2    Q    26
31  2    Q     6
32  2    Q     7
33  2    W    26
34  2    W     6
35  2    W     7
36  2    B     3
37  2    B     3
38  2    B     4
39  2    J     3
40  2    J     3
41  2    J     4
42  2    C     1
43  3    D     1
44  3    D    12
45  3    M     1
46  3    M    12
47  3    E     2
48  3    E     3
49  3    E     3
50  3    X     2
51  3    X     3
52  3    X     3
53  3    F     3
54  3    E     3

注意-

  1. 我有大约 1000 个带有嵌套值的列。所以,我需要一个可以循环输入每一列的函数。
  2. 我知道我们有来自包sparklyr.nestedsdf_unnest() 函数。但是,我不确定如何拆分多列的字符串并应用此功能。我是 sparklyr 的新手。

任何帮助将不胜感激。

【问题讨论】:

    标签: r apache-spark dplyr sparkr sparklyr


    【解决方案1】:

    你必须结合explodesplit

    sdt %>% 
      mutate(name = explode(split(name, ","))) %>% 
      mutate(value = explode(split(value, ",")))
    
    # Source:   lazy query [?? x 3]
    # Database: spark_connection
          id name  value
       <dbl> <chr> <chr>
     1  1.00 A     1    
     2  1.00 A     2    
     3  1.00 A     3    
     4  1.00 B     1    
     5  1.00 B     2    
     6  1.00 B     3    
     7  1.00 C     1    
     8  1.00 C     2    
     9  1.00 C     3    
    10  1.00 B     2   
    # ... with more rows   
    

    请注意,横向视图必须表示为单独的子查询,因此:

    sdt %>% 
      mutate(
        name = explode(split(name, ",")),
         value = explode(split(value, ",")))
    

    不会工作

    【讨论】:

    • 我有 1000 列。如何处理所有这些?
    • 使用标准的 R 循环。
    • 你可以试试。我个人会避开原生 R 代码,因为开销是不可接受的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 2018-09-16
    • 2022-01-10
    • 2021-02-16
    • 2015-08-22
    • 2021-02-24
    • 1970-01-01
    相关资源
    最近更新 更多