R将自定义矢量化函数应用于数据帧,特定列中的行

时间:2015-09-03 11:45:35

标签: r dataframe apply

这应该很简单,但我无法让apply与我的矢量化函数进行通信。

测试数据是:df <- data.frame(a = 1:3, b1 = c(4:5, NA), b2 = c(5,6,5)) 看起来像这样:

  a b1 b2
1 1  4  5
2 2  5  6
3 3 NA  5

自定义函数检查返回一个向量,以指示值是否落在给定的时间间隔内。

validScore <- function(x, a, b) {
  is.na(x) == FALSE &
  x%%1 == 0 &
  findInterval(x, c(a,b), rightmost.closed = TRUE) == 1
}

自定义函数测试:validScore(c(3, 3.5, 6, NA), 1, 5)按预期返回逻辑向量TRUE FALSE FALSE FALSE

我想在列b1和b2定义的行上运行自定义函数。这将返回TRUE FALSE FALSE(即T on(b1 = 4,b2 = 5),F on(b1 = 5,b2 = 6)和F on(b1 = NA,b2 = 5))。

选择列的答案Call apply-like function on each row of dataframe with multiple arguments from each rowhow to apply a function to every row of a matrix (or a data frame) in R共同提示以下内容:

library(dplyr)
apply(select(df, b1:b2), 1, function(x) validScore(x, 1, 5))

但实际上并没有将行发送到函数,而是单独评估每个值,因此输出为:

   [,1]  [,2]  [,3]
b1 TRUE  TRUE FALSE
b2 TRUE FALSE  TRUE

select(df, b1:b2) %>% rowwise() %>% apply(1, function(x) validScore(x, 1, 5))一样将rowwise()粘贴到中间没有任何区别。

我认为它可能与dplyr select返回的表单有关,但apply(df[, c("b1", "b2")], 1, function(x) validScore(x, 1, 5))也会生成相同的结果。

1 个答案:

答案 0 :(得分:2)

您不需要dplyrplyr。你可以使用基础R。

要做的第一件事就是让validScore只返回一个TRUEFALSE。这可以使用all函数

来完成
validScore <- function(x, a, b) {
  test = is.na(x) == FALSE &
    x %% 1 == 0 &
    findInterval(x, c(a,b), rightmost.closed = TRUE) == 1
  all(test)
}

之后只需使用标准apply

## Select columns 2 & 3 
apply(df[, 2:3], 1, validScore, a=1, b=8)