2016-01-21 46 views
-6

关于此论坛上的if语句有几个问题。我尝试了这些建议,但代码每次都会产生相同的错误。这里的代码应该做的事情的描述:R中的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 

在几篇文章中提到,如果陈述采取一个值,并没有接受,作为我看到的解释。如果声明是真的,那么我想知道else函数有什么用处。

+2

您是否在寻找削减'()'? – jogo

+4

这些帖子没有提到处理向量时需要使用'ifelse' ????????? –

+0

@jogo:我以前没有听说过裁员。你会扩展它吗? – sfyn

回答

1
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) 
+0

感谢您分享此内容。我以前没见过这个,我很感谢你分享这个。 – sfyn

+0

这是好的,我总是似乎忘了切() – latorrefabian

0

假设你有一个叫列长

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) 

完成

+2

不,没有数据框的例子 – latorrefabian

+0

感谢您发布这个例子,但它确实分离了两个级别,而不是4,因为我需要它。 – sfyn

+0

当然这是一个例子,这个想法就是你学习。通过这个例子,您可以定义更复杂的方式来分配级别,而限制您的时间间隔。 – latorrefabian

2

这里创建一个新列的有两个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" 
+0

感谢您发表本文。这样做更好理解,并有助于接受其他一些以前的评论(如完全一样)以考虑是否存在问题! – sfyn

+0

@sfyn很高兴我能帮忙。你可能想看看逻辑子集的主题。它通常更简洁,在我看来,比“ifelse”陈述更清晰。例如,上面代码中的第三行可以简单地为'd [file $ Duration> 6] < - “long”'。 – RHertel