【问题标题】:If, else if and else syntax within for loop in RR中for循环中的if,else if和else语法
【发布时间】:2022-01-10 08:07:50
【问题描述】:

这是我正在使用的示例数据框:

numbers <- data.frame(value=c(-5000,1,2,100,200,300,400,500, 1000, 2000, 10000, 12000))

我希望在此数据框中创建一个名为“输出”的新列,其中包含如下值:
- 如果值在 1 到 10000 之间,则与“值”列中的值相同
-10000 如果“值”列中的值大于 10000 并且
-1 如果“值”列中的值小于 1

新列“输出”中的所需输出:1,1,2,100,200,300,400,500,1000,2000,10000,10000。

我真的很想学习如何使用 for 循环、if、else if 和 else 语句来获取此输出,并尝试了以下方法:

for (i in 1:nrow (numbers$value)){
  if (numbers$value[i] >10000){
    numbers$output <- 10000)
  } else if (numbers$value[i] < 1){
    numbers$output <- 1)
  } else {
    numbers$output <- numbers$value)
  }
}

不幸的是,这给了我一个错误,错误:“}”中的意外'}'

感谢您帮助修复此代码!

【问题讨论】:

  • 这不是问题,但我建议在有两个以上if 的情况下考虑case_whenlibrary(dplyr) numbers %&gt;% mutate(newCol = case_when(between(value, 1,10000) ~ value, value &gt; 10000 ~ 10000, value &lt; 1 ~ 1))

标签: r loops for-loop if-statement


【解决方案1】:

我明白您为什么要尝试使用 for 循环来解决此问题(我去过那里..)。在 R 中,有一个有用的东西叫做向量化。您可以使用 *apply 系列在输入向量上应用函数。这样,你给函数一个输入,你就会自动得到一个相同长度的输出。

sapply(numbers$value, function(x){
  if (x >10000) return(10000)
  else if (x < 1) return(1)
  else return(x)
}) -> numbers$output

【讨论】:

  • 非常感谢!这很好用。
  • 作为后续,我可以问我如何为同一数据帧中的多个列复制此代码。示例数据框:numbersnew
  • purrr.tidyverse.org/reference/map_if.html - map_if 会让你选择列来应用函数
【解决方案2】:

原代码有几个错误:未初始化输出变量、不匹配和不需要的“)”、必要时未使用下标等错误。请参阅下面的更正代码。

numbers <- data.frame(value=c(-5000,1,2,100,200,300,400,500, 1000, 2000, 10000, 12000))
numbers$output<-NA
for (i in 1:nrow(numbers)){
   if (numbers$value[i] >10000){
      numbers$output[i] <- 10000
   } else if (numbers$value[i] < 1){
      numbers$output[i] <- 1
   } else {
      numbers$output[i] <- numbers$value[i]
   }
}
numbers

这是使用 dplyr 包中的 case_when 函数更直接的解决方案:

numbers <- data.frame(value=c(-5000,1,2,100,200,300,400,500, 1000, 2000, 10000, 12000))
library(dplyr)
numbers$output <-case_when(
   numbers$value >10000 ~ 10000,
   numbers$value < 1 ~ 1,
   TRUE ~ numbers$value. #default case
)
numbers

【讨论】:

  • 非常感谢您更正代码并提供另一种解决方案!欣赏它
【解决方案3】:

本着 ifelse-ness 的精神,您还可以使用 ifelse() 函数。

numbers$output &lt;- ifelse(numbers$value &gt; 1000, 1000, ifelse(numbers$value &lt; 0, 1, numbers$value))

【讨论】:

  • ifelse(number$value,
  • 聪明,还是逗号太多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多