R 使用ifelse和在内部指定列

R 使用ifelse和在内部指定列,r,if-statement,R,If Statement,为什么ifelse和In的功能不能一起工作?作为说明该问题的示例,我有以下代码。我想要的是创建两个列(Petal.Dim1和Petal.Dim2,它们只是Petal.Width和Petal.Length),但在sepa.Length大于5时切换 data(iris) within(iris, ifelse(Sepal.Length>5,{ Petal.Dim1 <-Petal.Width Petal.Dim2 <-

为什么ifelse和In的功能不能一起工作?作为说明该问题的示例,我有以下代码。我想要的是创建两个列(Petal.Dim1和Petal.Dim2,它们只是Petal.Width和Petal.Length),但在sepa.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}))
数据(iris)
内(鸢尾,萼片长度>5{

Petal.Dim1我不能说您的代码有什么问题,但我可以建议使用
转换

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)
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

可能更快,但我不确定。

您必须小心使用非标准求值。
中的
只是
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)
})

dat您误读了帮助文件(
?iflese
)。
ifelse
返回一个与测试形状相同的值。也就是说,它不执行操作,而是返回值。很酷,这是可行的,但我如何将Petal.Dim1和Petal.Dim2放在1 ifelse中?我必须在更大的数据集中使用多个列来缩放它。