R 将自定义矢量化函数应用于数据框中的行,特定列
R apply custom vectorised function to row in dataframe, specific columns
这应该很简单,但我无法让 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
自定义函数检查return一个向量以指示值是否落在给定区间内。
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)
return 逻辑向量 TRUE FALSE FALSE FALSE
符合预期。
我想 运行 在列 b1 和 b2 定义的行上使用自定义函数。这将 return 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 row for selecting the columns, and how 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 returned 的形式有关,但 apply(df[, c("b1", "b2")], 1, function(x) validScore(x, 1, 5))
也产生相同的结果。
您不需要 dplyr
或 plyr
。你可以只使用基础 R.
首先要做的是让validScore
return只有一个TRUE
或FALSE
。这可以使用 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)
这应该很简单,但我无法让 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
自定义函数检查return一个向量以指示值是否落在给定区间内。
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)
return 逻辑向量 TRUE FALSE FALSE FALSE
符合预期。
我想 运行 在列 b1 和 b2 定义的行上使用自定义函数。这将 return 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 row for selecting the columns, and how 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 returned 的形式有关,但 apply(df[, c("b1", "b2")], 1, function(x) validScore(x, 1, 5))
也产生相同的结果。
您不需要 dplyr
或 plyr
。你可以只使用基础 R.
首先要做的是让validScore
return只有一个TRUE
或FALSE
。这可以使用 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)