计算分组的_df dplyr中非NA列的数量

计算分组的_df dplyr中非NA列的数量,r,dplyr,janitor,R,Dplyr,Janitor,我正在尝试在我的.df中创建一列,该列给出(非NA)列数的值。在数据未分组的情况下,这很简单,因为我可以使用ncol()或dim(df)[2]。我的问题是试图在df中的组上使用这两个函数中的任何一个,特别是当我对数据进行分组时,一些列将变为空(然后我将其删除,因此列大小会在不同的分组之间发生变化) 例如: data(iris) iris$fake.dat1 <- rnorm(1:50) iris$fake.dat2 <- rnorm(1:50) iris$fake.dat3 <

我正在尝试在我的
.df
中创建一列,该列给出(非NA)列数的值。在数据未分组的情况下,这很简单,因为我可以使用
ncol()
dim(df)[2]
。我的问题是试图在df中的组上使用这两个函数中的任何一个,特别是当我对数据进行分组时,一些列将变为空(然后我将其删除,因此列大小会在不同的分组之间发生变化)

例如:

data(iris)
iris$fake.dat1 <- rnorm(1:50) 
iris$fake.dat2 <- rnorm(1:50)
iris$fake.dat3 <- rnorm(1:50)
# make some groups be all NA for some columns
iris$fake.dat1[iris$Species == 'setosa'] <- NA
iris$fake.dat2[iris$Species == 'setosa' | iris$Species == 'virginica'] <- NA
这是一列八位数字。如果我将数据过滤到每个组,则上面的操作似乎有效:

iris %>% 
  filter(Species == 'setosa') %>% 
  remove_empty_cols(.) %>% 
  mutate(num.col = ncol(.))

任何建议都将不胜感激

这取决于是否可能对组中的某些值(而非所有值)使用具有
NA
的变量,以及您希望如何对这些行或组进行计数

如果您只需要每行的非NA值的数量,那么解决方案非常简单:

库(tidyverse)
#添加部分NA列
虹膜%突变(假.dat3=ifelse(假.dat3<0,NA,假.dat3))
iris1%突变(num.col=rowSums(!is.na())
表(iris1$num.col)
#> 
#>  5  6  7  8 
#> 21 50 50 29
如果您想为每个具有一些非NA值的组计算列数,则需要稍微复杂一点:

iris2%
巢(-种类)%>%
mutate(num.col=map_int(data,~sum(map_lgl(.x,~!all(is.na(.xЮЮЮ)))%>%
unnest()
表(iris2$num.col)
#> 
#>  5  6  7 
#> 50 50 50
如果要为没有任何
NA
s的每个组计数列,请将
all
更改为
any

iris3%
巢(-种类)%>%
mutate(num.col=map_int(数据,~sum(map_lgl(.x,~!any(is.na(.xЮЮ)))%>%
unnest()
表(iris3$num.col)
#> 
#>  4  5  6 
#> 50 50 50

对于原始数据,所有方法都会返回相同的结果,但正如您所看到的,在实际数据上可能不会返回相同的结果。

这是第二种选择,而且效果非常好,谢谢!这当前返回一个错误
警告消息:1:“…”的所有元素都必须命名。你想要'data=c(萼片.长度,萼片.宽度,花瓣.长度,花瓣.宽度)'吗?2:“cols”现在是必需的。请使用'cols=c(data)`
是的,他们将希望您使用接口的方式更改为
nest()
,尽管它仍然可以正常工作。要消除错误,您可以将其更改为
iris%>%nest(data=-Species)
或等效项。
iris %>% 
  filter(Species == 'setosa') %>% 
  remove_empty_cols(.) %>% 
  mutate(num.col = ncol(.))