简体   繁体   English

在创建的 Function 中使用 Na.RM = TRUE

[英]Using Na.RM = TRUE in a created Function

I'm trying to calculate the SEM of some data but because there are NA's present, I can't get it to work.我正在尝试计算一些数据的 SEM,但由于存在 NA,我无法让它工作。 Here's the code I have:这是我的代码:

sem <- function(x, na.rm = TRUE) sd(x, na.rm = TRUE)/sqrt(length(x, na.rm = TRUE), na.rm = TRUE) #making a SEM function 



allbox.rptr %>%
  group_by(Trait, Time) %>%
  summarize(Mean_R = mean(R, na.rm = TRUE), SEM = sem(R, na.rm = TRUE))

Here is the data I'm using:这是我正在使用的数据:

dput(allbox.rptr)
structure(list(ID = c("R3L12", "R3L12", "R3L12", "R3L12", "R3L12", 
"R3L12", "R3L12", "R3L1", "R3L1", "R3L1", "R3L1", "R3L1", "R3L1", 
"R3L1", "R3L2", "R3L2", "R3L2", "R3L2", "R3L2", "R3L2", "R3L2", 
"R3L4", "R3L4", "R3L4", "R3L4", "R3L4", "R3L4", "R3L4", "R8L1", 
"R8L1", "R8L1", "R8L1", "R8L1", "R8L1", "R8L1", "R3L9", "R3L9", 
"R3L9", "R3L9", "R3L9", "R3L9", "R3L9", "R3L8", "R3L8", "R3L8", 
"R3L8", "R3L8", "R3L8", "R3L8", "R3L11", "R3L11", "R3L11", "R3L11", 
"R3L11", "R3L11", "R3L11", "R8NAT123", "R8NAT123", "R8NAT123", 
"R8NAT123", "R8NAT123", "R8NAT123", "R8NAT123", "R8L4", "R8L4", 
"R8L4", "R8L4", "R8L4", "R8L4", "R8L4", "R4L8", "R4L8", "R4L8", 
"R4L8", "R4L8", "R4L8", "R4L8"), Trait = c("ACC", "ACC", "Tb", 
"Tb", "HR", "HR", "Perc.Active", "ACC", "ACC", "Tb", "Tb", "HR", 
"HR", "Perc.Active", "ACC", "ACC", "Tb", "Tb", "HR", "HR", "Perc.Active", 
"ACC", "ACC", "Tb", "Tb", "HR", "HR", "Perc.Active", "ACC", "ACC", 
"Tb", "Tb", "HR", "HR", "Perc.Active", "ACC", "ACC", "Tb", "Tb", 
"HR", "HR", "Perc.Active", "ACC", "ACC", "Tb", "Tb", "HR", "HR", 
"Perc.Active", "ACC", "ACC", "Tb", "Tb", "HR", "HR", "Perc.Active", 
"ACC", "ACC", "Tb", "Tb", "HR", "HR", "Perc.Active", "ACC", "ACC", 
"Tb", "Tb", "HR", "HR", "Perc.Active", "ACC", "ACC", "Tb", "Tb", 
"HR", "HR", "Perc.Active"), Time = c(5, 30, 5, 30, 5, 30, 60, 
5, 30, 5, 30, 5, 30, 60, 5, 30, 5, 30, 5, 30, 60, 5, 30, 5, 30, 
5, 30, 60, 5, 30, 5, 30, 5, 30, 60, 5, 30, 5, 30, 5, 30, 60, 
5, 30, 5, 30, 5, 30, 60, 5, 30, 5, 30, 5, 30, 60, 5, 30, 5, 30, 
5, 30, 60, 5, 30, 5, 30, 5, 30, 60, 5, 30, 5, 30, 5, 30, 60), 
    R = c(0.119, 0.161, 0.22, 0.204, 0.098, 0.082, 0.252, 0.125, 
    0.171, 0.398, 0.348, 0.332, 0.266, 0.213, 0.199, 0.293, 0.419, 
    0.463, 0.31, 0.308, 0.343, 0.118, 0.161, 0.401, 0.495, 0.228, 
    0.293, 0.123, 0.041, 0.028, 0.188, 0.146, 0.268, 0.275, 0.006, 
    0.025, 0.036, 0.192, 0.194, 0.174, 0.136, 0.072, NA, NA, 
    0.138, 0.128, 0.375, 0.339, NA, 0.099, 0.16, 0.106, 0.08, 
    0.079, 0.074, 0.069, 0.207, 0.261, 0.723, 0.56, 0.545, 0.431, 
    0.109, 0.172, 0.249, 0.177, 0.117, 0.142, 0.158, 0.296, 0.108, 
    0.159, 0.099, 0.105, 0.101, 0.127, 0.212), SE = c(0.05, 0.071, 
    0.084, 0.082, 0.047, 0.047, 0.091, 0.05, 0.07, 0.096, 0.097, 
    0.092, 0.084, 0.09, 0.08, 0.111, 0.116, 0.127, 0.098, 0.101, 
    0.134, 0.047, 0.067, 0.098, 0.108, 0.072, 0.086, 0.067, 0.023, 
    0.026, 0.072, 0.06, 0.094, 0.092, 0.031, 0.019, 0.032, 0.071, 
    0.077, 0.067, 0.062, 0.057, NA, NA, 0.054, 0.054, 0.106, 
    0.098, NA, 0.046, 0.078, 0.047, 0.04, 0.035, 0.039, 0.053, 
    0.073, 0.087, 0.101, 0.119, 0.116, 0.117, 0.143, 0.07, 0.098, 
    0.068, 0.05, 0.059, 0.063, 0.114, 0.043, 0.064, 0.039, 0.039, 
    0.038, 0.049, 0.082)), row.names = c(NA, -77L), class = c("tbl_df", 
"tbl", "data.frame"))

When I run the code this is the error I get:当我运行代码时,这是我得到的错误:

 Error: Problem with `summarise()` column `SEM`.
ℹ `SEM = sem(R, na.rm = TRUE)`.
x 2 arguments passed to 'length' which requires 1
ℹ The error occurred in group 1: Trait = "ACC", Time = 5.
Run `rlang::last_error()` to see where the error occurred. 

Any help would be appreciated, thank you!任何帮助将不胜感激,谢谢!

In the OP's sem function, the na.rm argument was added to functions that doesn't have that argument.在 OP 的sem function 中,将na.rm参数添加到没有该参数的函数中。 Instead, it can be sum of logical vector ( .is.na(x) ) which gives the number of non-NA elements in the column (or can also be length(x[.is.na(x)]) )相反,它可以是逻辑向量( .is.na(x) )的sum ,它给出列中非 NA 元素的数量(或者也可以是length(x[.is.na(x)])

sem <- function(x, na.rm = TRUE) sd(x, na.rm = TRUE)/sqrt(sum(!is.na(x))) 

Now, we apply the code现在,我们应用代码

library(dplyr)
allbox.rptr %>%
  group_by(Trait, Time) %>%
  summarize(Mean_R = mean(R, na.rm = TRUE), 
      SEM = sem(R, na.rm = TRUE), .groups = 'drop')

-output -输出

# A tibble: 7 × 4
  Trait        Time Mean_R    SEM
  <chr>       <dbl>  <dbl>  <dbl>
1 ACC             5  0.121 0.0190
2 ACC            30  0.168 0.0275
3 HR              5  0.241 0.0432
4 HR             30  0.226 0.0352
5 Perc.Active    60  0.170 0.0348
6 Tb              5  0.278 0.0570
7 Tb             30  0.258 0.0530

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM