添加包含R中重复字符串编号之和的行



我很想知道每列上有多少个零("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
> 

最新更新