【问题标题】:use function in sapply R在 sapply R 中使用函数
【发布时间】:2020-04-21 14:01:13
【问题描述】:

我需要用#2 中的函数创建一个直方图,有人有想法吗?我收到警告信息: 在 hist(as.integer(project.timeV)) 中:强制引入的 NAs

#1.
roundNorm <- function(m, sd) { #m is Mean, sd is Standard Deviation
  x <- rnorm(1,m,sd)
  roundUp.X <- ceiling(x)
  return(roundUp.X)
}

#2.
project <- function(x) { # route 1: A-B-C-F, route 2: A-D-E-F
  a.time <- roundNorm(10,3)
  b.time <- roundNorm(10,3)
  c.time <- 5
  d.time <- 10
  e.time <- roundNorm(5,2)
  f.time <- 4
  if(b.time+c.time > d.time+e.time){
    projectLength <- a.time+b.time+c.time+f.time
    criRoute <- "A,B,C,F"
    answer <- c(projectLength,criRoute)
  }
  else {
    projectLength <- a.time+d.time+e.time+f.time
    criRoute <- "A,D,E,F"
    answer <- c(projectLength,criRoute)
  }
  return(answer)
}

#3.
samp <- 1:10000
project.timeV <- sapply(samp,project)
hist(as.integer(project.timeV))

【问题讨论】:

  • 什么是project.timeV?它是一个字符串吗?比较as.integer('a')
  • @MichaelChirico project.timeV 应该是我将用来制作直方图的向量

标签: r


【解决方案1】:

如果我这样做,我不会收到任何错误。

project.timeV <- sapply(samp, project, simplify = FALSE)
project.timeV <- do.call(rbind, project.timeV)
hist(as.integer(project.timeV[, 1]))

这是结果的预览。请注意,我不希望 sapply 简化我的结果。这是我对do.call 所做的事情,因为我想按行而不是按列进行展平。

> head(project.timeV)
     [,1] [,2]     
[1,] "34" "A,D,E,F"
[2,] "34" "A,B,C,F"
[3,] "26" "A,D,E,F"
[4,] "24" "A,B,C,F"
[5,] "29" "A,D,E,F"
[6,] "30" "A,D,E,F"

【讨论】:

  • 可行,但我不明白你对do.call做了什么
  • @YshaiSiboni 如果您检查sapply 之后的结果,您会注意到它是一个列表,每个元素都包含一个向量或一行矩阵。 do.call 适用于列表并将rbind 函数应用于所有元素。它有效地按行展平列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多