使用ifelse和in分配列

时间:2014-03-24 20:54:01

标签: r if-statement

为什么功能ifelse和内部不能一起工作?作为说明问题的一个例子,我有以下代码。我想要的是创建两个列(Petal.Dim1和Petal.Dim2,它们只是Petal.Width和Petal.Length),但只要Sepal.Length大于5就会切换。

data(iris)
within(iris, ifelse(Sepal.Length>5,{
                Petal.Dim1 <-Petal.Width
                Petal.Dim2 <-Petal.Length
            }, {
                Petal.Dim1<-Petal.Length
                Petal.Dim2<-Petal.Width}))

2 个答案:

答案 0 :(得分:1)

我不能说您的代码有什么问题,但我建议您使用transform

data(iris)
dat <- transform(iris, 
    Petal.Dim1=ifelse(Sepal.Length>5, Petal.Width, Petal.Length),
    Petal.Dim2=ifelse(Sepal.Length>5, Petal.Length, Petal.Width)
)
str(dat)

编辑: 一种更健壮的方式(在我看来)存储indizes并避免withintransform

idx <- iris[,"Sepal.Length"] > 5
dat <- iris
dat[idx, "Dim1"] <- Petal.Width
dat[idx, "Dim2"] <- Petal.Length
dat[!idx, "Dim1"] <- Petal.Length
dat[!idx, "Dim2"] <- Petal.Width

也许它更快,但我不确定。

答案 1 :(得分:1)

您必须小心使用非标准评估。 within只是eval的包装,所以这两个块都被执行,因为它不知道ifelse的行为。你想要这样的东西:

dat <- within(iris, {
  Petal.Dim1 <- ifelse(Sepal.Length > 5, Petal.Width, Petal.Length)
  Petal.Dim2 <- ifelse(Sepal.Length > 5, Petal.Length, Petal.Width)
})