繁体   English   中英

在满足阈值时使用循环编写函数

Writing a function with a loop when threshold is met

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一个数据框(数据),由639个数据组成,有6列。 每个单元表示以秒为单位的时间 我计算了每列的阈值。

到目前为止,我已经这样做了:每列的计算阈值。 因此6列的6个阈值

threshold1
[1] 16 22 31  6 11 13

threshold2
[1] 200.0 275.0 387.5  75.0 137.5 162.5

此阈值表示每列的最小和最大秒数。 所以我想(对所有列执行此操作):在第1列中突出显示值低于16秒的所有单元格以及值大于200秒的所有单元格。

我已经这样做了:

column1<-ifelse(data$column1<threshold1[1],"speeder",     
         ifelse(data$column1>threshold2[1], "slower",1))


column2<-ifelse(data$column2<threshold1[2],"speeder",     
         ifelse(data$column2>threshold2[2], "slower",1))

column3<-ifelse(data$column3<threshold1[3],"speeder",     
         ifelse(data$column3>threshold2[3], "slower",1))

所有6列都是如此。

现在我想在循环中编写它,所以我不需要每次都手动编写函数ifelse ,因为我有不同的数据集,包含不同数量的列。

2 个回复

首先生成名为“dat”的数据:

dat <- data.frame(
    column1 = runif(n = 638, min=0, max=220),
    column2 = runif(n = 638, min=0, max=300),
    column3 = runif(n = 638, min=0, max=400),
    column4 = runif(n = 638, min=0, max=100),
    column5 = runif(n = 638, min=0, max=150),
    column6 = runif(n = 638, min=0, max=200))

# define thresholds    
threshold1 <- c(16, 22, 31, 6, 11, 13)
threshold2 <- c(200.0, 275.0, 387.5, 75.0, 137.5, 162.5)

使用循环

# Declare a list that will contain the results
results <- list()

# Loop over the columns
for(i in seq_len(ncol(dat))) {
    results[[colnames(dat)[i]]] <- ifelse(dat[,i] < threshold1[i],
                                          yes = "speeder", 
                                          no = ifelse(dat[,i] > threshold2[i], 
                                                      yes = "slower", no = 1))
}

使用lapply

您也可以使用lapply而不是循环,如下所示:

results <- lapply(1:ncol(dat), function(x) {
    ifelse(dat[,x] < threshold1[x],
           yes = "speeder", 
           no = ifelse(dat[,x] > threshold2[x],
                       yes = "slower", no = 1))
})

names(results) <- colnames(dat)

结果

您可以使用results[[1]]results[[6]]results$column1results$column6访问results$column6

> head(results$column1, 100)

  [1] "1"       "1"       "1"       "1"       "1"       "1"       "slower" 
  [8] "1"       "slower"  "1"       "1"       "1"       "speeder" "1"      
 [15] "1"       "1"       "1"       "1"       "1"       "1"       "1"      
 [22] "slower"  "1"       "1"       "1"       "1"       "1"       "1"      
 [29] "1"       "1"       "1"       "slower"  "1"       "slower"  "slower" 
 [36] "1"       "1"       "1"       "1"       "speeder" "1"       "1"      
 [43] "1"       "1"       "speeder" "speeder" "1"       "1"       "slower" 
 [50] "1"       "1"       "slower"  "1"       "1"       "1"       "1"      
 [57] "1"       "1"       "1"       "1"       "1"       "1"       "1"      
 [64] "1"       "1"       "1"       "1"       "slower"  "1"       "1"      
 [71] "slower"  "1"       "1"       "1"       "speeder" "1"       "1"      
 [78] "1"       "1"       "1"       "1"       "slower"  "1"       "1"      
 [85] "1"       "1"       "1"       "1"       "1"       "1"       "1"      
 [92] "1"       "1"       "1"       "1"       "1"       "1"       "1"      
 [99] "speeder" "1" 

你也可以试试lapply ..它会比循环更快..

dat <- data.frame(
  column1 = runif(n = 638, min=0, max=220),
  column2 = runif(n = 638, min=0, max=300),
  column3 = runif(n = 638, min=0, max=400),
  column4 = runif(n = 638, min=0, max=100),
  column5 = runif(n = 638, min=0, max=150),
  column6 = runif(n = 638, min=0, max=200))

# define thresholds    
threshold1 <- c(16, 22, 31, 6, 11, 13)
threshold2 <- c(200.0, 275.0, 387.5, 75.0, 137.5, 162.5)

result = matrix(unlist(lapply(seq(6), function(i){
  ifelse(dat[,i] < threshold1[i],
         yes = "speeder", 
         no = ifelse(dat[,i] > threshold2[i], 
                     yes = "slower", no = 1))
})), ncol = 6, byrow = FALSE)

head(result)
     [,1]      [,2] [,3] [,4]     [,5] [,6]
[1,] "speeder" "1"  "1"  "slower" "1"  "1" 
[2,] "1"       "1"  "1"  "1"      "1"  "1" 
[3,] "1"       "1"  "1"  "1"      "1"  "1" 
[4,] "1"       "1"  "1"  "slower" "1"  "1" 
[5,] "1"       "1"  "1"  "1"      "1"  "1" 
[6,] "1"       "1"  "1"  "slower" "1"  "1" 
1 在 R 中编写阈值函数

我正在尝试创建一个函数,以便数据帧 df 中的每个值 x 如果高于 y,则替换为 1,否则替换为 0。 我试过了 使用它,返回警告: 我不知道为什么? 干杯。 编辑:抱歉。 我添加了我的数据框以供参考。 ...

2 编写云函数时如何避免循环?

为 firebase firestore 编写基于事件的云函数时,通常会更新受影响文档中的字段,例如: 当更新用户集合的文档时,将触发一个函数,假设我们要确定用户信息状态并且我们有一个completeInfo: boolean属性,该函数将不得不执行另一个更新以便触发器再次触发,如果我们不要使用n ...

3 当函数随着每次迭代而增加时,如何编写for循环?

我试图估计在移除动物并检测时间和空间变化的多个观察期内从n.sites中检测动物的概率。 如果我在5个观察期内做这样的事情,它会起作用: 时间2的概率取决于时间1的概率,时间3的概率取决于时间1和2的概率。如果我只是这样做了5个时间段,那么写出来并不是什么大问题这个。 但是当我得到1 ...

4 如何编写一个循环,直到满足条件为止

我已经在R中编写了以下循环。我希望循环一直运行,直到出现Y大于或等于3的情况为止。然后我想显示T,这是实验次数,直到出现这种结果为止。第一次。 我对R很陌生,我不确定如何更改已完成的工作以实现所需的功能。 ...

2014-03-05 15:15:25 4 2577   r
5 为什么这个函数即使满足条件也不会结束它的循环?

我创建了这个脚本来在一天中的某个时间打开一个网站,但是当我尝试创建一个循环来检查直到满足条件时,(在这种情况下,条件是时间是 13:27 ),即使到了正确的时间,网站也打不开,但程序仍在空闲状态下运行。 编辑:除了不止一次初始化 x 之外,我意识到我实际上并没有调用函数 oops。 ...

6 如何使用日期范围编写函数而不是for循环

我是经验研究和R领域的新法律教授。我正在研究法官的工作量(如他/她在30天内完成的案件数量)还是他/她的案件积压(如案件开立的比例) (在相同范围内结案的案件)影响案件结局。 一些样本数据: 数据如下所示: 因此,我想计算法官在判决案当日的30天积压案件和完成率。 我已经弄清 ...

7 当R中满足列条件时,使用for循环填充矩阵

我在学习R时进行了生态研究,并试图编写一个函数来创建多个矩阵。 我的数据框如下所示: 打印: 我正在寻找创建一个for循环,该循环将产生矩阵并将其存储在列表中。 这些矩阵将基于每年的牵引量和种类。 例如,我一直在尝试类似的东西。 这一直没有工作。 我在 ...

9 满足我的条件时如何退出循环?

我正在与BluePrism一起工作,我必须遍历集合,有时有+1000行。 例如 : 我循环遍历一个集合并搜索单词“ hello ”,如果在第10行找到了该单词,我想停止循环其余990行。 然后,在同一集合中对另一个单词进行另一个循环,依此类推。 这可能吗 ? 目前,我正在循 ...

10 条件满足时for循环不会结束

一旦输出itor = end ,它就会出错-“映射集迭代器不可递增”。 我认为for循环应该在它再次增加之前结束,因为it!=gameObjects.end()在此之后将为false。 在else语句中添加一个break解决该问题。 为什么不break就不能工作? 我假设与检查条件 ...

暂无
暂无

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

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