我想将火花数据帧中的NA / NULL分配给它最近的邻居 . 我来自R背景,所以我使用sparklyr,但无法找到一种方法来做到这一点 .
这是一个示例代码:
set.seed(1)
example <- data.frame (ID = 1:10, Cat = letters[1:5],
Numb = sample(c(NA, NA, NA, NA, 1:10), 10))
ID Cat Numb
1 1 a NA
2 2 b 1
3 3 c 3
4 4 d 6
5 5 e NA
6 6 a 5
7 7 b 4
8 8 c 9
9 9 d 10
10 10 e NA
所以我想填写Numb列,ID 1 NA到ID2 Numb 1,ID 5到id 4和6(6或5),ID 10到ID 9值(10) . 它可以在R中轻松完成 . 无论如何,通过Sparklyr在Spark中做到了吗?
这是我的R解决方案:
example$Numb1 <- example$Numb[c(1,1:(nrow(example)-1))]
example$Numb2 <- example$Numb[c(2:(nrow(example)), nrow(example))]
example$Merge <- ifelse(is.na(example$Numb), ifelse(is.na(example$Numb1),
example$Numb2, example$Numb1), example$Numb)
ID Cat Numb Numb1 Numb2 Merge
1 1 a NA NA 1 1
2 2 b 1 NA 3 1
3 3 c 3 1 6 3
4 4 d 6 3 NA 6
5 5 e NA 6 5 6
6 6 a 5 NA 4 5
7 7 b 4 5 9 4
8 8 c 9 4 10 9
9 9 d 10 9 NA 10
10 10 e NA 10 NA 10
当然,如果连续行中有多个NA值,事情会变得更复杂 . 也许可以建议另一个建议 .
但对于闪闪发光的人来说,我不知道我能做些什么 .
1 回答
这是一个部分工作的解决方案,带有SQL查询和
dplyr
包中的mutate
函数 . 它没有解决连续行中多个NA值的情况,因为它是基本R解决方案的转换,但它可能对其他(更完整)方法有用 .我已经使用了HiveQL的Lag and Lead函数来执行列的"shifting"向上和向下 . 它涉及创建一个新的辅助Spark表(example2),它保存"Numb1"和"Numb2"列 . 然后,一旦创建了辅助表,就可以使用
mutate
创建"Merged"列作为旁注,您还可以通过
COALESCE
函数避免使用mutate
函数(以及所有ifelse
) . 我认为这会更有效率 .我希望这有帮助 .
EDITED
如果你想完全避免使用SQL,你也可以使用
dplyr
函数:我在编写两个连续的
mutate
函数时遇到了一些麻烦(这就是我首先使用混合SQL-dplyr方法的原因) . 我最终在sparklyr上开了一个issue .