在dplyr中删除具有多个NAs且组为“”的行

在dplyr中删除具有多个NAs且组为“”的行,r,dplyr,R,Dplyr,我有一个玩具数据框: df <- data.frame(id=c(1,1,2,3,4,4),p_id=c(1001,1001,1002,1003,1004,1004),x=c(1,NA,1,2,NA,1),y=c(NA,5,4,NA,6,NA),z=c(NA,NA,2,3,NA,4)) id p_id x y z 1 1001 1 NA NA 1 1001 NA 5 NA 2 1002 1 4 2 3 1003 2 NA 3 4 1004

我有一个玩具数据框:

df <- data.frame(id=c(1,1,2,3,4,4),p_id=c(1001,1001,1002,1003,1004,1004),x=c(1,NA,1,2,NA,1),y=c(NA,5,4,NA,6,NA),z=c(NA,NA,2,3,NA,4))

id p_id  x  y   z
1  1001  1  NA  NA
1  1001 NA  5   NA
2  1002  1  4    2
3  1003  2  NA   3
4  1004 NA  6   NA
4  1004  1  NA   4
我正在快速解决此问题(不确定最佳方法):


但是,当应用于大型数据帧(2500 x 650)时,这种解决方法非常缓慢,并且会为正常的单元创建不需要的NAs。同样对于上下文,此df中带有NA的重复p_id行来自spread函数

按“id”列分组后,通过使用
if/else
创建一个条件来执行
summary\u all
,以返回
NaN
,前提是每个组中该列中的所有元素都是
NA
,或者使用非NA元素(在本例中,只有一个非NA元素,因此我们将其子集化)


您可能可以通过
tidyr::fill()
然后是
summary

 df %>% 
   group_by(id) %>%  
   fill(x,y,z, .direction = "up") %>% 
   summarise_all(first)
#> # A tibble: 4 x 5
#>      id  p_id     x     y     z
#>   <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1     1  1001     1     5    NA
#> 2     2  1002     1     4     2
#> 3     3  1003     2    NA     3
#> 4     4  1004     1     6     4
df%>%
分组依据(id)%>%
填充(x,y,z,.direction=“up”)%%>%
总结所有(第一)
#>#A tibble:4 x 5
#>id p_id x y z
#>       
#>1110015北美
#> 2     2  1002     1     4     2
#>3 3 1003 2 NA 3
#> 4     4  1004     1     6     4

TIL tidyr::fill。就性能而言,它比上面akrun的解决方案慢。
df %>% select(-id) %>% group_by(p_id) %>% summarise_all(funs(mean),na.rm=T) %>% ungroup()
df %>%
  group_by(id, p_id) %>%
  summarise_all(funs(if(all(is.na(.))) NaN else .[!is.na(.)]))
# A tibble: 4 x 5
# Groups:   id [?]
#     id  p_id     x     y     z
#  <dbl> <dbl> <dbl> <dbl> <dbl>
#1     1  1001     1     5   NaN
#2     2  1002     1     4     2
#3     3  1003     2   NaN     3
#4     4  1004     1     6     4
df %>% 
  group_by(id, p_id) %>% 
  summarise_all(funs(if(all(is.na(.))) NaN else mean(., na.rm = TRUE)))
 df %>% 
   group_by(id) %>%  
   fill(x,y,z, .direction = "up") %>% 
   summarise_all(first)
#> # A tibble: 4 x 5
#>      id  p_id     x     y     z
#>   <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1     1  1001     1     5    NA
#> 2     2  1002     1     4     2
#> 3     3  1003     2    NA     3
#> 4     4  1004     1     6     4