我很想知道每列上有多少个零("0"(。如何生成一行,该行包含";0";以及每列上的非零?
Name <- c("G1", "G2", "G3", "G4","G5", "G6")
Obs1 <- c(0, 1, 4, 7, 0, 2)
Obs2 <- c(6, 1, 0, 3, 0, 1)
Obs3 <- c(0, 0, 0, 8, 0, 0)
df <- data.frame(Name, Obs1, Obs2, Obs3)
期望输出:
Name Obs1 Obs2 Obs3
Zeros 2 2 5
Non-zeros 4 4 1
G1 0 6 0
G2 1 1 0
G3 4 0 0
G4 7 3 8
G5 0 0 0
G6 2 1 0
您可以使用colSums
计算每列中的零值和非零值。
data <- data.frame(Name = c('Zero', 'Non-zero'),
rbind(colSums(df[-1] == 0), colSums(df[-1] != 0)))
rbind(data, df)
# Name Obs1 Obs2 Obs3
#1 Zero 2 2 5
#2 Non-zero 4 4 1
#3 G1 0 6 0
#4 G2 1 1 0
#5 G3 4 0 0
#6 G4 7 3 8
#7 G5 0 0 0
#8 G6 2 1 0
如果您想要dplyr
答案,可以尝试:
library(dplyr)
df %>%
summarise(across(starts_with('Obs'), list(Zero = ~sum(. == 0),
Nonzero = ~sum(. != 0)))) %>%
tidyr::pivot_longer(cols = everything(),
names_sep = '_',
names_to = c('.value', 'Name')) %>%
bind_rows(df)
使用基本R
df <- rbind(sapply(df, function(x) sum(x == 0)), sapply(df, function(x) sum(x != 0)),df)
df$Name[c(1,2)] <- c('Zero','Non-Zero')
df
Name Obs1 Obs2 Obs3
1 Zero 2 2 5
2 Non-Zero 4 4 1
3 G1 0 6 0
4 G2 1 1 0
5 G3 4 0 0
6 G4 7 3 8
7 G5 0 0 0
8 G6 2 1 0
>