寻找子集< - 函数

时间:2011-10-17 06:48:20

标签: r

我想知道是否有类似subset函数的东西,但是对于赋值而不是提取。我常常需要做一些像

这样的事情
rows <- # some condition
df$x[rows] <- with(df[rows, ], {
    # operation 1...
})
df$y[rows] <- with(df[rows, ], {
    # operation 2...
})

在我看来,能够写

会很好
subset(df, rows, c(x, y)) <- (some expression combining operations 1 and 2)

那里有这样的东西吗?

编辑:一些背景。在SAS中,可以编写像

这样的数据处理代码
if /* condition */ then do;
    x = ...; y = ...; z = ...;
end;
else if /* some other condition */ then do;
    x = ...; y = ...; z = ...;
end;
else if /* etcetera */

我基本上是在寻找最简单/最优雅的方式在R中复制它。直接翻译将涉及数据框中所有行的for循环,显然我宁愿不这样做。

2 个答案:

答案 0 :(得分:2)

请记住,subset只是最重要的糖。因此,为什么不使用[提供的“基本”子集:

df[rows, c("x", "y")]<-with(df[rows,], {...})

这会为你减少吗?

答案 1 :(得分:0)

关于SAS-ish处理,如果行的顺序不相关:

  1. 在data.frame中添加一列,其中包含不同的案例 一个因素。你可以,例如为此使用ifelse,但取决于 条件,可能有更好的方法。我假设这个专栏是 现在命名为“proctype”
  2. 加载plyr,并使用ddply类似于:

    的内容
    ddply(df, .(proctype), function(curdf){
        #you can use with/within here with curdf
        curproctype <- curdf$proctype[1]
        switch(curproctype, #note: may be easier to just use an if here
           nameoffirstproctypelevel = firstkindofprocessing(curdf),
           nameofsecondproctypelevel = secondkindofprocessing(curdf))
    })