如何在R中根据两组求值的和,即使存在缺失值?


如果存在缺失值,我们可以使用dplyr包的`group_by`和`summarise`函数来根据两组求值的和。

例如,如果我们有一个名为df的数据框,其中包含一个数值列(例如Num)和两个分组列(例如Grp1和Grp2),那么如果df中存在缺失值,则可以通过使用以下命令来找到基于Grp1和Grp2的Num中值的和:

df%>%group_by(Grp1,Grp2)%>%summarise(Sum=sum(Num,na.rm=TRUE))

示例1

以下代码片段创建一个示例数据框:

grp1<-sample(LETTERS[1:3],20,replace=TRUE)
grp2<-sample(letters[1:3],20,replace=TRUE)
Dep_Var<-sample(c(NA,rpois(2,5)),20,replace=TRUE)
df1<-data.frame(grp1,grp2,Dep_Var)
df1

输出

创建以下数据框:

   grp1 grp2 Dep_Var
1   A    a    4
2   A    c   NA
3   C    a    5
4   A    c   NA
5   A    b   NA
6   A    a    4
7   C    c    5
8   B    b    4
9   C    a   NA
10  A    c    5
11  B    a   NA
12  B    c    5
13  A    c   NA
14  C    c    4
15  C    c    5
16  A    a   NA
17  C    b    4
18  A    a    4
19  B    a    4
20  B    a   NA

要加载dplyr包并根据grp1和grp2查找Dep_Var中值的和,请将以下代码添加到上面的代码片段中:

library(dplyr)
df1%>%group_by(grp1,grp2)%>%summarise(Sum=sum(Dep_Var,na.rm=TRUE))
`summarise()` regrouping Output by 'grp1' (override with `.groups` argument)
# A tibble: 9 x 3
# Groups: grp1 [3]

输出

如果您将以上所有代码片段作为一个程序执行,它将生成以下输出:

grp1 grp2 Sum
 <chr> <chr> <int>
1  A   a    12
2  A   b     0
3  A   c     5
4  B   a     4
5  B   b     4
6  B   c     5
7  C   a     5
8  C   b     4
9  C   c    14

示例2

以下代码片段创建一个示例数据框:

Class<-sample(c("First","Second","Third"),20,replace=TRUE)
Rank<-sample(1:4,20,replace=TRUE)
Score<-sample(1:100,20)
df2<-data.frame(Class,Rank,Score)
df2

输出

创建以下数据框:

  Class   Rank Score
1  Second  4   100
2  First   4    76
3  First   2    54
4  Third   3    66
5  Third   2    98
6  Second  1    81
7  First   3    95
8  Second  1     7
9  Third   3    94
10 Second  1    78
11 Third   3    13
12 Third   2    19
13 Second  4    30
14 First   4    31
15 Second  3    87
16 First   3    38
17 First   1    60
18 First   3    36
19 Second  4     3
20 Third   3    84

要根据班级和排名查找Score中值的和,请将以下代码添加到上面的代码片段中:

df2%>%group_by(Class,Rank)%>%summarise(Sum=sum(Score,na.rm=TRUE))
`summarise()` regrouping

Output

by 'Class' (override with `.groups` argument) # A tibble: 9 x 3 # Groups: Class [3]

输出

如果您将以上所有代码片段作为一个程序执行,它将生成以下输出:

  Class  Rank   Sum
  <chr>  <int> <int>
1  First   1   60
2  First   2   54
3  First   3  169
4  First   4  107
5  Second  1  166
6  Second  3   87
7  Second  4  133
8  Third   2  117
9  Third   3  257

更新于:2021年11月2日

283次浏览

开启您的职业生涯

通过完成课程获得认证

开始学习
广告