我希望在R中对数据框的每一行应用某些函数。
该函数可以返回单行数据框或什么也不返回(我猜 'return ()' 不返回任何东西?)。
我想将此函数应用于给定数据框的每一行,并获得结果数据框(可能比原始数据框更短,即拥有较少的行)。
例如,如果原始数据框类似于:
id size name
1 100 dave
2 200 sarah
3 50 ben
我正在使用的函数从数据框中获取一行(即单行数据框),如果名称与“brave”押韵,则原样返回它,否则返回null。结果应该是:
id size name
1 100 dave
这个例子实际上是指过滤数据框,并且我希望得到一个针对这种任务的答案,但也可以适用于更一般的情况,即即使辅助函数的结果(作用于单个行)可能是任意数据框(仅有一行)。请注意,即使在过滤的情况下,我也想使用一些复杂的逻辑(不是像
$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
)。更新: 根据Stephen的回复,我做了以下操作:
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
才会留在数据框中。这似乎可以解决问题,但我收到一个警告,提示“数值表达式有53个元素:仅使用第一个”。