【发布时间】:2011-04-08 17:34:09
【问题描述】:
我想对 R 中数据框的每一行应用一些函数。
该函数可以返回单行数据帧或什么都不返回(我猜'return()'什么都不返回?)。
我想将此函数应用于给定数据帧的每一行,并获得结果数据帧(可能比原始数据帧更短,即行数更少)。
例如,如果原始数据框类似于:
id size name
1 100 dave
2 200 sarah
3 50 ben
我正在使用的函数获取数据帧中的一行(即单行数据帧),如果名称与“勇敢”押韵,则按原样返回,否则返回 null,那么结果应该是:
id size name
1 100 dave
这个例子实际上是指过滤一个数据框,我很想得到一个特定于这种任务的答案,也想得到一个更一般的情况,即使是辅助函数的结果(在单个row) 可以是具有单行的任意数据框。请注意,即使在过滤的情况下,我也想使用一些复杂的逻辑(不是像$size>100 这样简单的东西,而是由函数检查的更复杂的条件,比如boo(single_row_df)。
附:
到目前为止,在这些情况下我所做的是使用apply(df, MARGIN=1) 然后使用do.call(rbind ...) 但我认为当我的数据框只有一行时它会给我带来一些麻烦(我得到Error in do.call(rbind, filterd) : second argument must be a list)
更新
在斯蒂芬回复之后,我做了以下事情:
ranges.filter <- function(ranges,boo) {
subset(x=ranges,subset=!any(boo[start:end]))
}
然后我用一些看起来像这样的范围数据框调用ranges.filter:
start end
100 200
250 400
698 1520
1988 2147
...
还有一些布尔向量
(TRUE,FALSE,TRUE,TRUE,TRUE,...)
我想从布尔向量中过滤掉任何包含 TRUE 值的范围。例如,如果布尔向量在100 .. 200 位置上的布尔向量为FALSE,则第一个范围100 .. 200 将留在数据框中。
这似乎可以完成工作,但我收到一条警告说numerical expression has 53 elements: only the first used。
【问题讨论】: