R语言 按组计算数据框中的非NA值
在这篇文章中,我们将讨论如何在R编程语言中按数据框架中的组来计算非NA值。
方法1:使用group_by()和summaryise()方法
dplyr包被用来通过执行操作和转换来对数据进行模拟。R编程语言中的group_by()方法是用来对R中指定的数据框架进行分组的。
语法:
group_by(col-name)
在应用group_by()方法时,会应用summaryize方法来计算根据每组获得的总数值。非空值的汇总是使用指定的列名和以is.na()方法为参数提供的汇总方法sum()计算的。
语法:
summarise ( new-col-name = sum(is.na (col-name))
这两种方法都是使用管道操作符依次应用于输入数据帧。输出结果以二进制形式返回,第一列由group_by方法的输入参数组成,第二列被指定为新的列名,并包含每一列值的求和。
例子
# creating a dataframe
data_frame <- data.frame(col1 = sample(6:9, 9 , replace = TRUE),
col2 = letters[1:3],
col3 = c(1,4,NA,1,NA,NA,2,NA,2))
print ("Original DataFrame")
print (data_frame)
# grouping data by col1 and giving a total of
# non na values in col3
data_frame %>% group_by(col1) %>% summarise(
non_na = sum(!is.na(col3)))
输出
[1] "Original DataFrame"
col1 col2 col3
1 6 a 1
2 8 b 4
3 6 c NA
4 8 a 1
5 8 b NA
6 9 c NA
7 8 a 2
8 7 b NA
9 6 c 2
# A tibble: 4 x 2
col1 non_na
<int> <int>
1 6 2
2 7 0
3 8 3
4 9 0
方法2:使用data.table
R中的库data.table用于在将数据组织成定义明确的表格结构的基础上进行统计计算和审议。R中的setDT方法用于通过引用将列表(包括命名的和未命名的)和数据帧转换为数据表。类似的sum()和is.na()方法依次应用于数据框架的各列,以获得最终输出。返回的输出是以 data.table 的形式出现的,其中行号后面是行标识符,后面是冒号。
语法:
setDT(df)[, . (new-col-name = sum(!is.na(new-col-name))), col-name]
例子
# importing required libraries
library(data.table)
# creating a dataframe
data_frame <- data.frame(col1 = sample(6:9, 9 , replace = TRUE),
col2 = letters[1:3],
col3 = c(1,4,NA,1,NA,NA,2,NA,2))
print ("Original DataFrame")
print (data_frame)
# grouping data by col1 and giving a total
# of non na values in col3
mod_df <- setDT(data_frame)[, .(non_na = sum(!is.na(col3))), col1]
print ("Modified DataFrame")
print (mod_df)
输出
[1] "Original DataFrame"
col1 col2 col3
1 7 a 1
2 6 b 4
3 6 c NA
4 7 a 1
5 9 b NA
6 8 c NA
7 6 a 2
8 8 b NA
9 8 c 2
[1] "Modified DataFrame"
col1 non_na
1: 7 2
2: 6 2
3: 9 0
4: 8 1
方法3:使用聚合方法
R中的聚合方法用于创建由数据帧分割结果产生的子集,然后计算每个返回组的汇总统计数据。
语法:
aggregate(x , data , FUN)
参数:
x – R的存储对象。
data – 要应用聚合方法的数据帧或列表。
FUN–应用于数据框中每一组的函数。
R编程语言中的cbind()方法被用来产生一个作为输出的列的连接。应用的FUN是计算基于组隔离的非空值的总和的操作。数据是应用FUN的输入数据框。
例子
# importing required libraries
library(data.table)
# creating a dataframe
data_frame <- data.frame(col1 = sample(6:9, 9 , replace = TRUE),
col2 = letters[1:3],
col3 = c(1,4,NA,1,NA,NA,2,NA,2))
print ("Original DataFrame")
print (data_frame)
# grouping data by col1 and giving a total
# of non na values in col3
mod_df <- aggregate(cbind(
non_na = !is.na(col3))~col1, data_frame, sum)
print ("Modified DataFrame")
print (mod_df)
输出
[1] "Original DataFrame"
col1 col2 col3
1 7 a 1
2 6 b 4
3 6 c NA
4 7 a 1
5 9 b NA
6 8 c NA
7 6 a 2
8 8 b NA
9 8 c 2
[1] "Modified DataFrame"
col1 non_na
1 7 2
2 6 2
3 9 0
4 8 1
方法4:使用table()方法
R中的库data.table用于在将数据组织成定义明确的表格结构的基础上进行统计计算和审议。table()方法用于在计算每个因素水平的组合后生成一个计数的或然率表。因此,它被用来对数据进行分类制表。最初,使用is.na()函数在约束条件下指定检查NA值的所需列。然后提取非空值,并使用data.table索引方法对其进行统计。
语法:
is.na (df$col-name))
例子
# importing required libraries
library(data.table)
# creating a dataframe
data_frame <- data.frame(col1 = sample(6:9, 9 , replace = TRUE),
col2 = letters[1:3],
col3 = c(1,4,NA,1,NA,NA,2,NA,2))
print ("Original DataFrame")
print (data_frame)
# grouping data by col1 and giving a
# total of non na values in col3
mod_df <- table(data_framecol1[!is.na(data_framecol3)])
print ("Modified DataFrame")
print (mod_df)
输出
[1] "Original DataFrame"
col1 col2 col3
1 7 a 1
2 9 b 4
3 8 c NA
4 6 a 1
5 6 b NA
6 8 c NA
7 9 a 2
8 9 b NA
9 8 c 2
[1] "Modified DataFrame"
6 7 8 9
1 1 1 2