【问题标题】:Explanation for If statement in RR中If语句的解释
【发布时间】:2016-01-21 19:21:19
【问题描述】:

在这个论坛上有几个关于 if 语句的问题。我尝试了这些建议,但代码每次都产生相同的错误。下面是代码应该做什么的描述:

  • 在现有数据框(文件)中创建一个新列(效率)
  • 根据现有列(持续时间)中的值填充效率列

我创建了以下代码:

file$Efficiency<-if(file$Duration <= 5) {"Above Par"} else
{if(file$Duration > 5 & file$Duration <= 15) {"Par"} else
{if(file$Duration > 15 & file$Duration <= 30) {"Below Par"} else
{"Unacceptable"}}}

我收到以下警告

Warning message:
In if (file$Duration <= 5) { :
the condition has length > 1 and only the first element will be used

在几篇文章中提到 if 语句采用一个值并且没有接受它作为我所看到的解释。如果这句话是真的,那么我想知道 else 函数有什么用。

【问题讨论】:

  • 您在寻找cut() 吗?
  • 这些帖子中没有提到在处理向量时需要使用ifelse?????????
  • @jogo:我以前没听说过cut。你能扩展一下吗?
  • @42: If else 满足一个条件,我的尝试是搜索不同的时间并相应地分配效率级别。
  • file$Duration 是一个向量,它的一些元素可能满足条件,而另一些则不满足。这种模棱两可导致只考虑第一个元素的警告。通过使用ifelse,您可以为file$Duration 中的每个向量元素定义一个动作,具体取决于它是否满足条件。

标签: r if-statement


【解决方案1】:

这是一个带有两个 ifelse 语句的矢量化解决方案:

file <- data.frame(Duration=c(1,2,3,4,3,4,5,6,7))
d <- ifelse (file$Duration > 3, "medium", "short")
d <- ifelse (file$Duration > 6, "long", d)
> d
#[1] "short"  "short"  "short"  "medium" "short"  "medium" "medium" "medium" "long" 

【讨论】:

  • 感谢您发布此信息。这更有意义,并有助于接受其他一些以前的 cmets(尽管它们是完整的)来考虑 ifelse!
  • @sfyn 很高兴我能帮上忙。您可能想研究逻辑子集的主题。在我看来,它通常比ifelse 语句更简洁、更清晰。例如,上面代码中的第三行可以简单地为d[file$Duration &gt; 6] &lt;- "long"
【解决方案2】:
file$Efficiency <- cut(file$Duration, breaks=c(-1,5,15,30,200), labels=c("Above Par", "Par", "Below Par", "Unacceptable"))

这是我的数据的一个小例子:

x <- c(0,1, 4:6, 14:16, 29:31)
y <- cut(x, breaks=c(-1,5,15,30,200), labels=c("Above Par", "Par", "Below Par", "Unacceptable"))
data.frame(x=x, y=y)

【讨论】:

  • 感谢分享。我以前没见过这个,很感谢你分享这个。
【解决方案3】:

假设您有一个包含名为 Duration 的列的数据框

 a = data.frame(Duration=c(1,2,3,4,3,4,5,6,7))

定义一个根据持续时间返回效率值的函数:

eff <- function(duration){
    if (duration<5) return('bad')
    else return('good')}

为数据框创建一个新列

a[, 'Efficiency'] <- sapply(a$Duration, eff)

完成

【讨论】:

  • 感谢您发布此示例,但它确实分隔了两个级别,而不是我需要的 4 级。
  • 当然是一个例子,想法是你学习。通过此示例,您可以定义更复杂的方法来分配级别,而 cut 您仅限于间隔。
猜你喜欢
  • 1970-01-01
  • 2015-04-03
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多