R mean()表示数值和完整数据上的NA错误

R mean()表示数值和完整数据上的NA错误,r,R,样本数据 set.seed(123) library(dplyr) Sessions <- ceiling(rnorm(50, mean = 3000, sd = 300)) Registrations <- ceiling(rnorm(50, mean = 800, sd = 100)) Conversions <- ceiling(rnorm(50, mean = 400, sd = 50)) Date_Range = seq(Sys.Date() - 50, Sys.Da

样本数据

set.seed(123)
library(dplyr)
Sessions <- ceiling(rnorm(50, mean = 3000, sd = 300))
Registrations <- ceiling(rnorm(50, mean = 800, sd = 100))
Conversions <- ceiling(rnorm(50, mean = 400, sd = 50))
Date_Range = seq(Sys.Date() - 50, Sys.Date() - 1, by = 1)
sample_data <- data.frame(Date_Range,Sessions, Registrations, Conversions)
sample_data <- tbl_df(sample_data)
到目前为止还不错

但是:

这是一组完整的数字数据,甚至不必使用na.rm=TRUE(我确实尝试过,添加了na.rm+T,这一点从来没有改变过)


因此,如果我有完整的数字数据,为什么会出现此错误?我该怎么办?

问题是
意味着
在数据帧上不起作用。错误与以下内容相同:

mean(data.frame(A = 1:3))
[1] NA
Warning message:
In mean.default(data.frame(A = 1:3)) :
  argument is not numeric or logical: returning NA
dplyr
select返回数据帧,但未为数据帧定义
mean
,来自
?mean
,以下是关于参数x的内容:

一个R对象。目前有用于数字/逻辑向量的方法 和日期、日期时间和时间间隔对象。复向量是 仅允许修剪=0

同样的原因
sum
也可以,因为:

sum(data.frame(A = 1:3))
[1] 6
工作。(这里的行为似乎不一致。)


如果您希望函数同时适用于
sum
mean
,更好的方法可能是从函数返回向量:

dataByDates <- function(startDate, endDate, metric) {
      filter(sample_data, Date_Range >= startDate & Date_Range <= endDate) %>% select_(metric)
    }
dataByDates <- function(startDate, endDate, metric) {
      filter(sample_data, Date_Range >= startDate & Date_Range <= endDate)[[metric]]
    }

我们可以提取列并获得
平均值

aggByDates(Sys.Date()-10, Sys.Date()-1, metric = "Sessions") %>% 
                 .$Sessions %>%
                  mean
#[1] 2997.9
(再次)谢谢你。已经被接受的答案在$metric部分是动态的,这也是可取的
mean(data.frame(A = 1:3))
[1] NA
Warning message:
In mean.default(data.frame(A = 1:3)) :
  argument is not numeric or logical: returning NA
sum(data.frame(A = 1:3))
[1] 6
dataByDates <- function(startDate, endDate, metric) {
      filter(sample_data, Date_Range >= startDate & Date_Range <= endDate)[[metric]]
    }
sum(dataByDates(Sys.Date()-10, Sys.Date()-1, metric = "Sessions"))
[1] 29979

mean(dataByDates(Sys.Date()-10, Sys.Date()-1, metric = "Sessions"))
[1] 2997.9
aggByDates(Sys.Date()-10, Sys.Date()-1, metric = "Sessions") %>% 
                 .$Sessions %>%
                  mean
#[1] 2997.9