Продолжая исследование открытого набора данных Земельной книги с использованием SparkR, я хотел узнать, на какой дороге в Великобритании было больше всего продаж недвижимости за последние 20 лет.
Напомним, что вот так выглядит фрейм данных:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
./spark-1.5.0-bin-hadoop2.6/bin/sparkR --packages com.databricks:spark-csv_2.11:1.2.0 > sales <- read.df(sqlContext, "pp-complete.csv", "com.databricks.spark.csv", header="false") > head(sales) C0 C1 C2 C3 C4 C51 {0C7ADEF5-878D-4066-B785-0000003ED74A} 163000 2003-02-21 00:00 UB5 4PJ T N2 {35F67271-ABD4-40DA-AB09-00000085B9D3} 247500 2005-07-15 00:00 TA19 9DD D N3 {B20B1C74-E8E1-4137-AB3E-0000011DF342} 320000 2010-09-10 00:00 W4 1DZ F N4 {7D6B0915-C56B-4275-AF9B-00000156BCE7} 104000 1997-08-27 00:00 NE61 2BH D N5 {47B60101-B64C-413D-8F60-000002F1692D} 147995 2003-05-02 00:00 PE33 0RU D N6 {51F797CA-7BEB-4958-821F-000003E464AE} 110000 2013-03-22 00:00 NR35 2SF T N C6 C7 C8 C9 C10 C111 F 106 READING ROAD NORTHOLT NORTHOLT2 F 58 ADAMS MEADOW ILMINSTER ILMINSTER3 L 58 WHELLOCK ROAD LONDON4 F 17 WESTGATE MORPETH MORPETH5 F 4 MASON GARDENS WEST WINCH KING'S LYNN6 F 5 WILD FLOWER WAY DITCHINGHAM BUNGAY C12 C13 C141 EALING GREATER LONDON A2 SOUTH SOMERSET SOMERSET A3 EALING GREATER LONDON A4 CASTLE MORPETH NORTHUMBERLAND A5 KING'S LYNN AND WEST NORFOLK NORFOLK A6 SOUTH NORFOLK NORFOLK A |
Этот документ объясняет данные, хранящиеся в каждом поле, и для этого конкретного запроса мы заинтересованы в полях C9-C12. Планируется сгруппировать фрейм данных по этим полям, а затем отсортировать по частоте в порядке убывания.
При группировании по нескольким полям легче всего создать новое поле, которое объединит их все, а затем сгруппировать по ним.
Я начал со следующего:
|
1
2
3
|
> sales$address = paste(sales$C9, sales$C10, sales$C11, sales$C12, sep=", ")Error in as.character.default(<S4 object of class "Column">) : no method for coercing this S4 class to a vector |
Не так удачно! Далее я пошел еще более примитивно:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
> sales$address = sales$C9 + ", " + sales$C10 + ", " + sales$C11 + ", " + sales$C12 > head(sales) C0 C1 C2 C3 C4 C51 {0C7ADEF5-878D-4066-B785-0000003ED74A} 163000 2003-02-21 00:00 UB5 4PJ T N2 {35F67271-ABD4-40DA-AB09-00000085B9D3} 247500 2005-07-15 00:00 TA19 9DD D N3 {B20B1C74-E8E1-4137-AB3E-0000011DF342} 320000 2010-09-10 00:00 W4 1DZ F N4 {7D6B0915-C56B-4275-AF9B-00000156BCE7} 104000 1997-08-27 00:00 NE61 2BH D N5 {47B60101-B64C-413D-8F60-000002F1692D} 147995 2003-05-02 00:00 PE33 0RU D N6 {51F797CA-7BEB-4958-821F-000003E464AE} 110000 2013-03-22 00:00 NR35 2SF T N C6 C7 C8 C9 C10 C111 F 106 READING ROAD NORTHOLT NORTHOLT2 F 58 ADAMS MEADOW ILMINSTER ILMINSTER3 L 58 WHELLOCK ROAD LONDON4 F 17 WESTGATE MORPETH MORPETH5 F 4 MASON GARDENS WEST WINCH KING'S LYNN6 F 5 WILD FLOWER WAY DITCHINGHAM BUNGAY C12 C13 C14 address1 EALING GREATER LONDON A NA2 SOUTH SOMERSET SOMERSET A NA3 EALING GREATER LONDON A NA4 CASTLE MORPETH NORTHUMBERLAND A NA5 KING'S LYNN AND WEST NORFOLK NORFOLK A NA6 SOUTH NORFOLK NORFOLK A NA |
Это по крайней мере скомпилировано, но все адреса были «NA», что не то, что мы хотим. После небольшого поиска я понял, что есть функция concat, которую я мог использовать именно для этой задачи:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
> sales$address = concat_ws(sep=", ", sales$C9, sales$C10, sales$C11, sales$C12) > head(sales) C0 C1 C2 C3 C4 C51 {0C7ADEF5-878D-4066-B785-0000003ED74A} 163000 2003-02-21 00:00 UB5 4PJ T N2 {35F67271-ABD4-40DA-AB09-00000085B9D3} 247500 2005-07-15 00:00 TA19 9DD D N3 {B20B1C74-E8E1-4137-AB3E-0000011DF342} 320000 2010-09-10 00:00 W4 1DZ F N4 {7D6B0915-C56B-4275-AF9B-00000156BCE7} 104000 1997-08-27 00:00 NE61 2BH D N5 {47B60101-B64C-413D-8F60-000002F1692D} 147995 2003-05-02 00:00 PE33 0RU D N6 {51F797CA-7BEB-4958-821F-000003E464AE} 110000 2013-03-22 00:00 NR35 2SF T N C6 C7 C8 C9 C10 C111 F 106 READING ROAD NORTHOLT NORTHOLT2 F 58 ADAMS MEADOW ILMINSTER ILMINSTER3 L 58 WHELLOCK ROAD LONDON4 F 17 WESTGATE MORPETH MORPETH5 F 4 MASON GARDENS WEST WINCH KING'S LYNN6 F 5 WILD FLOWER WAY DITCHINGHAM BUNGAY C12 C13 C141 EALING GREATER LONDON A2 SOUTH SOMERSET SOMERSET A3 EALING GREATER LONDON A4 CASTLE MORPETH NORTHUMBERLAND A5 KING'S LYNN AND WEST NORFOLK NORFOLK A6 SOUTH NORFOLK NORFOLK A address1 READING ROAD, NORTHOLT, NORTHOLT, EALING2 ADAMS MEADOW, ILMINSTER, ILMINSTER, SOUTH SOMERSET3 WHELLOCK ROAD, , LONDON, EALING4 WESTGATE, MORPETH, MORPETH, CASTLE MORPETH5 MASON GARDENS, WEST WINCH, KING'S LYNN, KING'S LYNN AND WEST NORFOLK6 WILD FLOWER WAY, DITCHINGHAM, BUNGAY, SOUTH NORFOLK |
Это больше походит на это! Теперь посмотрим, на каких улицах продано больше всего недвижимости:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
> byAddress = summarize(groupBy(sales, sales$address), count = n(sales$address))> head(arrange(byAddress, desc(byAddress$count)), 10) address count1 BARBICAN, LONDON, LONDON, CITY OF LONDON 13982 CHRISTCHURCH ROAD, BOURNEMOUTH, BOURNEMOUTH, BOURNEMOUTH 13133 MAIDA VALE, LONDON, LONDON, CITY OF WESTMINSTER 13054 ROTHERHITHE STREET, LONDON, LONDON, SOUTHWARK 12535 SLOANE AVENUE, LONDON, LONDON, KENSINGTON AND CHELSEA 12196 THE STRAND, BRIGHTON MARINA VILLAGE, BRIGHTON, BRIGHTON AND HOVE 12187 FAIRFIELD ROAD, LONDON, LONDON, TOWER HAMLETS 12178 QUEENSTOWN ROAD, , LONDON, WANDSWORTH 11539 UPPER RICHMOND ROAD, LONDON, LONDON, WANDSWORTH 112310 QUEENSTOWN ROAD, LONDON, LONDON, WANDSWORTH 1079 |
Далее мы углубимся в данные, но это для другого поста.
| Ссылка: | SparkR: добавьте новый столбец во фрейм данных, объединив другие столбцы от нашего партнера по JCG Марка Нидхэма в блоге Марка Нидхэма . |