R中for循环内的If、else if和else语法

3htmauhk  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(157)

这是我正在使用的示例 Dataframe :

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

我希望在此数据框中创建一个名为“output”的新列,其中包含如下所示的值:

  • 如果值在1和10000之间,则与“值”列中的值相同
    如果“值”列中的值大于10000,则为-10000,并且
    如果“值”列中的值小于1,则为-1
    在新列“输出”中输入所需的输出:一、一、二、一百、二百、三百、四百、五百、一千、两千、一万、一万。
    我真的很想学习如何使用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)
  }
}

不幸的是,这给了我一个错误,错误:“}”中意外的“}”
感谢您帮助修复此代码!

mlnl4t2r

mlnl4t2r1#

我明白你为什么要用for循环来解决这个问题了(我也有过类似的经历)。在R中,有一个很有用的东西叫做向量化。你可以使用 *apply家族来将一个函数应用于一个输入向量。这样,你就给予了函数一个输入,你就自动得到了一个相同长度的输出。

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

vc6uscn92#

原始代码中有几处错误:未初始化输出变量、不匹配且不需要的“)"、需要时未使用下标等错误,见下面修正后的代码。

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
bis0qfac

bis0qfac3#

本着ifelse-ness的精神,您也可以使用ifelse()函数。
numbers$output <- ifelse(numbers$value > 1000, 1000, ifelse(numbers$value < 0, 1, numbers$value))

相关问题