计算分组的_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(.))