2011-10-17 87 views
1

我想知道是否有像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.直接翻译会涉及到用于遍历数据帧中的所有行,显然我宁愿不这样做。

+0

如何选择你的行的基础上,一些标准是什么?你总是只有2个操作?如果是这样的话,像在sapply()这样的ifelse()可能会让你在那里 – nzcoops

+0

理想情况下,它将是完全通用的,这样我可以指定一些表达式来对子集进行子集化,我可以允许分配多个列。 –

回答

2

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

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

这是否削减对吗?

+0

部分;我希望能够做到没有临时的'rows'变量。我基本上试图以优雅的方式复制SAS的程序化if-then-else语法来处理数据步骤。 –

0

关于SAS上下的处理,如果行的顺序是不相关的:

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

另请注意:没有什么能阻止你编写一个简单的循环,这实际上是SAS在幕后做的事情...... –