对于具有特定数量的 NA 或根本没有 NA 的变量,如何从 R 中的数据框计算均值?
How to calculate means from data frame in R for a variable with specific amount of NAs or not NAs at all?
所以我在表格中有很多数据(每天 4 个值)
date var1 var2
1 2003-10-28 1.2 970
2 2003-10-28 NA 510
3 2003-10-28 NA 640
4 2003-10-28 NA 730
5 2003-10-30 2.0 570
6 2003-10-30 NA 480
7 2003-10-30 1.2 580
8 2003-10-30 1.2 297
9 2002-05-07 3.0 830
10 2002-05-07 4.8 507
11 2002-05-07 4.8 253
12 2002-05-07 NA 798
并且我需要每天计算 var1 的总和,例如,如果该特定日期的 NA 值(或 none)少于 2 个,则应忽略该日期。同时,如果还计算了 var1 的总和,我应该计算相同日期的 var2 的均值。然后我应该将这些平均值、总和和日期保存到另一个数据框中,这样那些被忽略的日期就不会存在了。
我尝试了各种循环结构,但我对必须为根本没有 NA 的日期计算均值和总和这一事实感到困惑。保存日期、平均值和总和也让我陷入困境,因为我不知道如何正确地进行索引。
因此此样本数据的预期输出应如下所示
date sum(var1) mean(var2)
1 2003-10-30 4.8 480.75
2 2002-05-07 17.4 561.75
使用dplyr
。假设您的原始数据集是 df
library(dplyr)
df %>% group_by(date) %>% filter(sum(is.na(var1)) <= 2)%>% summarise(Sum = sum(var1, na.rm = T), Mean = mean(var2, na.rm = T))
数据
df <- read.table(text = " date var1 var2
1 2003-10-28 1.2 970
2 2003-10-28 NA 510
3 2003-10-28 NA 640
4 2003-10-28 NA 730
5 2003-10-30 2.0 570
6 2003-10-30 NA 480
7 2003-10-30 1.2 580
8 2003-10-30 1.2 297
9 2002-05-07 3.0 830
10 2002-05-07 4.8 507
11 2002-05-07 4.8 253
12 2002-05-07 NA 798",header =TRUE)
输出
Source: local data frame [2 x 3]
date Sum Mean
(date) (dbl) (dbl)
1 2002-05-07 12.6 597.00
2 2003-10-30 4.4 481.75
这是 data.table
的选项。将'data.frame'转换为'data.table'(setDT(df1)
),按'date'分组if
'var1'中的NA值个数小于3,则得到 'var1' 的 sum
和 'var2' 的 mean
。
library(data.table)
setDT(df1)[,if(sum(is.na(var1)) < 3) .(Sum = sum(var1, na.rm=TRUE),
Mean = mean(var2, na.rm=TRUE)) , by = date]
# date Sum Mean
#1: 2003-10-30 4.4 481.75
#2: 2002-05-07 12.6 597.00
所以我在表格中有很多数据(每天 4 个值)
date var1 var2
1 2003-10-28 1.2 970
2 2003-10-28 NA 510
3 2003-10-28 NA 640
4 2003-10-28 NA 730
5 2003-10-30 2.0 570
6 2003-10-30 NA 480
7 2003-10-30 1.2 580
8 2003-10-30 1.2 297
9 2002-05-07 3.0 830
10 2002-05-07 4.8 507
11 2002-05-07 4.8 253
12 2002-05-07 NA 798
并且我需要每天计算 var1 的总和,例如,如果该特定日期的 NA 值(或 none)少于 2 个,则应忽略该日期。同时,如果还计算了 var1 的总和,我应该计算相同日期的 var2 的均值。然后我应该将这些平均值、总和和日期保存到另一个数据框中,这样那些被忽略的日期就不会存在了。
我尝试了各种循环结构,但我对必须为根本没有 NA 的日期计算均值和总和这一事实感到困惑。保存日期、平均值和总和也让我陷入困境,因为我不知道如何正确地进行索引。
因此此样本数据的预期输出应如下所示
date sum(var1) mean(var2)
1 2003-10-30 4.8 480.75
2 2002-05-07 17.4 561.75
使用dplyr
。假设您的原始数据集是 df
library(dplyr)
df %>% group_by(date) %>% filter(sum(is.na(var1)) <= 2)%>% summarise(Sum = sum(var1, na.rm = T), Mean = mean(var2, na.rm = T))
数据
df <- read.table(text = " date var1 var2
1 2003-10-28 1.2 970
2 2003-10-28 NA 510
3 2003-10-28 NA 640
4 2003-10-28 NA 730
5 2003-10-30 2.0 570
6 2003-10-30 NA 480
7 2003-10-30 1.2 580
8 2003-10-30 1.2 297
9 2002-05-07 3.0 830
10 2002-05-07 4.8 507
11 2002-05-07 4.8 253
12 2002-05-07 NA 798",header =TRUE)
输出
Source: local data frame [2 x 3]
date Sum Mean
(date) (dbl) (dbl)
1 2002-05-07 12.6 597.00
2 2003-10-30 4.4 481.75
这是 data.table
的选项。将'data.frame'转换为'data.table'(setDT(df1)
),按'date'分组if
'var1'中的NA值个数小于3,则得到 'var1' 的 sum
和 'var2' 的 mean
。
library(data.table)
setDT(df1)[,if(sum(is.na(var1)) < 3) .(Sum = sum(var1, na.rm=TRUE),
Mean = mean(var2, na.rm=TRUE)) , by = date]
# date Sum Mean
#1: 2003-10-30 4.4 481.75
#2: 2002-05-07 12.6 597.00