按组计算总缺失值?
Count total missing values by group?
编辑:输入
对此很陌生。
我遇到了类似的问题:
从该问题中获取输入数据:
df1 <- data.frame(
Z = sample(LETTERS[1:5], size = 10000, replace = T),
X1 = sample(c(1:10,NA), 10000, replace = T),
X2 = sample(c(1:25,NA), 10000, replace = T),
X3 = sample(c(1:5,NA), 10000, replace = T))
正如一位用户所建议的,可以使用 summarise_each
:
df1 %>%
group_by(Z) %>%
summarise_each(funs(sum(is.na(.))))
#Source: local data frame [5 x 4]
#
# Z X1 X2 X3
# (fctr) (int) (int) (int)
#1 A 169 77 334
#2 B 170 77 316
#3 C 159 78 348
#4 D 181 79 326
#5 E 174 69 341
但是,我只想获得每组缺失值的总数。
我也试过这个但是没用:R count NA by group
理想情况下,它应该给我这样的东西:
# Z sumNA
# (fctr) (int)
#1 A 580
#2 B 493
#3 C 585
#4 D 586
#5 E 584
提前致谢。
您可以使用 tidyverse
方法。
require(tidyverse)
#Sample data
dat <- data.frame(group = rep(c("a", "b", "c", "d", "g"), 3),
y = rep(c(1, NA, 2, NA, 3), 3))
dat %>%
group_by(group) %>%
summarise(sumNA = sum(is.na(y)))
输出:
group sumNA
<fct> <int>
1 a 0
2 b 3
3 c 0
4 d 3
5 g 0
编辑
但是,如果您有多个列,则可以使用 summarize_all
(如果您想指定列,则可以使用 summarize_at
;谢谢@bschneidr 的评论):
#Sample data
set.seed(123)
dat <- data.frame(group = sample(letters[1:4], 10, replace = T),
x = sample(c(1,NA), 10, replace = T),
y = sample(c(1,NA), 10, replace = T),
z = sample(c(1, NA), 10, replace = T))
dat %>%
group_by(group) %>%
summarize_all(.funs = funs('NA' = sum(is.na(.))))
# A tibble: 4 x 4
group x_NA y_NA z_NA
<fct> <int> <int> <int>
1 a 1 1 0
2 b 3 2 2
3 c 0 1 1
4 d 1 4 2
如果您的数据看起来像链接 post:
df1 <- data.frame(
Z = as.factor(sample(LETTERS[1:5], size = 10000, replace = T)),
X1 = sample(c(1:10,NA), 10000, replace = T),
X2 = sample(c(1:25,NA), 10000, replace = T),
X3 = sample(c(1:5,NA), 10000, replace = T)
)
您可以在 base R 中执行以下操作:
res <- sapply(split(df1[-1], f = df1$Z), function(x) colSums(is.na(x)))
print(res)
# A B C D E
#X1 193 180 199 170 183
#X2 74 68 79 90 87
#X3 350 349 340 336 328
如果确实需要转置,可以调用t(res)
:
print(t(res))
# X1 X2 X3
#A 193 74 350
#B 180 68 349
#C 199 79 340
#D 170 90 336
#E 183 87 328
编辑:如果你想要所有 NA 的总和而不是每个变量内的上述作品的以下小修改:
res2 <- sapply(split(df1[-1], f = df1$Z), function(x) sum(is.na(x)))
print(res2)
# A B C D E
#589 588 569 646 598
或者,colSums(res)
会给你同样的结果。同样,t()
如果需要作为列。
data.table
解决方案
library(data.table)
setDT(df1)
df1[, .(sumNA = sum(is.na(.SD))), by = Z]
# Z sumNA
# 1: A 559
# 2: C 661
# 3: E 596
# 4: B 597
# 5: D 560
dplyr
使用 rowSums(.[-1])
的解决方案,即除第一列之外的所有列的行总和。
library(dplyr)
df1 %>%
group_by(Z) %>%
summarise_all(~sum(is.na(.))) %>%
transmute(Z, sumNA = rowSums(.[-1]))
# # A tibble: 5 x 2
# Z sumNA
# <fct> <dbl>
# 1 A 559
# 2 B 597
# 3 C 661
# 4 D 560
# 5 E 596
编辑:输入
对此很陌生。
我遇到了类似的问题:
从该问题中获取输入数据:
df1 <- data.frame(
Z = sample(LETTERS[1:5], size = 10000, replace = T),
X1 = sample(c(1:10,NA), 10000, replace = T),
X2 = sample(c(1:25,NA), 10000, replace = T),
X3 = sample(c(1:5,NA), 10000, replace = T))
正如一位用户所建议的,可以使用 summarise_each
:
df1 %>%
group_by(Z) %>%
summarise_each(funs(sum(is.na(.))))
#Source: local data frame [5 x 4]
#
# Z X1 X2 X3
# (fctr) (int) (int) (int)
#1 A 169 77 334
#2 B 170 77 316
#3 C 159 78 348
#4 D 181 79 326
#5 E 174 69 341
但是,我只想获得每组缺失值的总数。
我也试过这个但是没用:R count NA by group
理想情况下,它应该给我这样的东西:
# Z sumNA
# (fctr) (int)
#1 A 580
#2 B 493
#3 C 585
#4 D 586
#5 E 584
提前致谢。
您可以使用 tidyverse
方法。
require(tidyverse)
#Sample data
dat <- data.frame(group = rep(c("a", "b", "c", "d", "g"), 3),
y = rep(c(1, NA, 2, NA, 3), 3))
dat %>%
group_by(group) %>%
summarise(sumNA = sum(is.na(y)))
输出:
group sumNA
<fct> <int>
1 a 0
2 b 3
3 c 0
4 d 3
5 g 0
编辑
但是,如果您有多个列,则可以使用 summarize_all
(如果您想指定列,则可以使用 summarize_at
;谢谢@bschneidr 的评论):
#Sample data
set.seed(123)
dat <- data.frame(group = sample(letters[1:4], 10, replace = T),
x = sample(c(1,NA), 10, replace = T),
y = sample(c(1,NA), 10, replace = T),
z = sample(c(1, NA), 10, replace = T))
dat %>%
group_by(group) %>%
summarize_all(.funs = funs('NA' = sum(is.na(.))))
# A tibble: 4 x 4
group x_NA y_NA z_NA
<fct> <int> <int> <int>
1 a 1 1 0
2 b 3 2 2
3 c 0 1 1
4 d 1 4 2
如果您的数据看起来像链接 post:
df1 <- data.frame(
Z = as.factor(sample(LETTERS[1:5], size = 10000, replace = T)),
X1 = sample(c(1:10,NA), 10000, replace = T),
X2 = sample(c(1:25,NA), 10000, replace = T),
X3 = sample(c(1:5,NA), 10000, replace = T)
)
您可以在 base R 中执行以下操作:
res <- sapply(split(df1[-1], f = df1$Z), function(x) colSums(is.na(x)))
print(res)
# A B C D E
#X1 193 180 199 170 183
#X2 74 68 79 90 87
#X3 350 349 340 336 328
如果确实需要转置,可以调用t(res)
:
print(t(res))
# X1 X2 X3
#A 193 74 350
#B 180 68 349
#C 199 79 340
#D 170 90 336
#E 183 87 328
编辑:如果你想要所有 NA 的总和而不是每个变量内的上述作品的以下小修改:
res2 <- sapply(split(df1[-1], f = df1$Z), function(x) sum(is.na(x)))
print(res2)
# A B C D E
#589 588 569 646 598
或者,colSums(res)
会给你同样的结果。同样,t()
如果需要作为列。
data.table
解决方案
library(data.table)
setDT(df1)
df1[, .(sumNA = sum(is.na(.SD))), by = Z]
# Z sumNA
# 1: A 559
# 2: C 661
# 3: E 596
# 4: B 597
# 5: D 560
dplyr
使用 rowSums(.[-1])
的解决方案,即除第一列之外的所有列的行总和。
library(dplyr)
df1 %>%
group_by(Z) %>%
summarise_all(~sum(is.na(.))) %>%
transmute(Z, sumNA = rowSums(.[-1]))
# # A tibble: 5 x 2
# Z sumNA
# <fct> <dbl>
# 1 A 559
# 2 B 597
# 3 C 661
# 4 D 560
# 5 E 596