【问题标题】:Function using conditions使用条件的函数
【发布时间】:2019-02-19 19:39:46
【问题描述】:

我正在尝试创建一个函数,该函数考虑确定数量的样本(河流),每个样本(河流)具有确定数量的观察值。给定 10 个样本,每个样本在对数正态分布中具有 12 个观测值,均值 = 4 且 sd = 1.4,我想获得计算特定数字(6 - 它指的是水质测量的标准数字)的次数。 以下是一项实验的代码,将“限制”视为允许超过 6 的最大观察次数。

set.seed(1001)
nobs<-12
limit<-round(0.10 * nobs, digits = 0) 
h2o <- as.data.frame(matrix(rnorm(10*12, mean = 4, sd = 1.4), ncol = 12))
paste(rep("Riv", nrow(h2o)), c(1:nrow(h2o)), sep = "")
rownames(h2o) <- paste(rep("Riv", nrow(h2o)), c(1:nrow(h2o)), sep = "")
colnames(h2o) <- paste(rep("Obs", ncol(h2o)), c(1:ncol(h2o)), sep = "")

#在假设每条河流的观测数为 2 或更多的情况下宣布受损的河流数量?

ifelse(h2o >=6,1,0)
h2o$Test<-rowSums(ifelse(h2o >=6,1,0))
length(h2o$Test[h2o$Test>1])

该函数应恢复以前的数据,并适用于不同样本的不同观察结果。

谢谢

【问题讨论】:

  • 拜托,您能指定要传递给函数的参数以及预期的返回值是多少吗?
  • 我的参数是r&lt;-c(10,50,100,500) 序列中的河流数量,我从中获取 10、50、100 和 500 个样本来评估水质。
  • 我的参数是 r&lt;-c(10,50,100,500) 序列中的河流 # 条,我从中获取 10、50、100 和 500 个样本来评估水质。我希望获得数值高于标准限值 6 的河流数的模拟。因此,对于 10 条河流中的 10 个样本,我知道有 20% 的样本超过 6 个。现在,我不仅想要10 x 10 的值,但也有高达 10 x 500 和 500 x 10 至 500 x 500 的值。我有这个循环 vec&lt;-seq(10,500,by=10) for(i in vec) { res&lt;-Test(y=i,x=10) results[i]&lt;-res results10&lt;-results[!is.na(results)] }

标签: r function if-statement


【解决方案1】:

这是一个使用来自tidyversedplyrtidyr 的函数。

library(tidyverse)

test_h2o <- function(data, threshold_quality = 6, limit = 1) {
  table <- data %>%
  rownames_to_column("river") %>%
  gather(observation, value, -river) %>%
    mutate(over_lim = value > threshold_quality)

  table_wide <- table %>%
    select(river, observation, over_lim) %>%
    mutate(over_lim = over_lim %>% as.integer()) %>%
    spread(observation, over_lim)

  summary <- table %>%
    group_by(river) %>%
    summarize(over_lim_count = sum(over_lim))

  result <- summary %>%
    summarize(num_impaired = sum(over_lim_count > limit))

  list(table_wide, summary, result)
}

这是输出,旨在显示示例中的步骤:

> test_h2o(h2o)
[[1]]
   river Obs1 Obs10 Obs11 Obs12 Obs2 Obs3 Obs4 Obs5 Obs6 Obs7 Obs8 Obs9
1   Riv1    0     0     0     0    0    0    0    0    0    0    0    0
2  Riv10    0     0     0     0    0    0    0    0    0    0    0    0
3   Riv2    0     0     1     0    0    0    0    0    0    0    0    0
4   Riv3    1     0     0     0    0    0    0    0    0    0    0    0
5   Riv4    0     0     0     0    0    0    0    0    0    0    0    1
6   Riv5    0     1     0     0    0    0    0    0    0    0    0    0
7   Riv6    0     1     1     0    0    1    0    0    0    0    0    0
8   Riv7    0     0     0     0    0    0    0    0    0    0    0    0
9   Riv8    0     0     0     0    0    0    0    1    0    1    0    0
10  Riv9    1     0     0     0    0    0    0    0    0    0    0    0

[[2]]
# A tibble: 10 x 2
   river over_lim_count
   <chr>          <int>
 1 Riv1               0
 2 Riv10              0
 3 Riv2               1
 4 Riv3               1
 5 Riv4               1
 6 Riv5               1
 7 Riv6               3
 8 Riv7               0
 9 Riv8               2
10 Riv9               1

[[3]]
# A tibble: 1 x 1
  num_impaired
         <int>
1            2

【讨论】:

  • 乔恩看起来很棒。我正在考虑使用像这样更简单的东西:Test &lt;- function(x,y) { n &lt;- length(x) nobs&lt;- y limit&lt;-round(0.10 * y, digits = 0) h2o &lt;- as.data.frame(matrix(rnorm(n*y, mean=4, sd=1.4), ncol= y)) h2o$Test &lt;- rowSums(ifelse(h2o&gt;6, 1, 0)) length(h2o$Test[h2o$Test&gt;limit])/y return(h2o$Test) } Test(10,100),用于 10 条河流和 100 次观测。这段代码显然有问题。
猜你喜欢
  • 1970-01-01
  • 2017-02-10
  • 2022-11-13
  • 2023-04-06
  • 1970-01-01
  • 2023-04-07
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多