簡體   English   中英

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

自定義函數檢查返回一個向量以指示值是否落在給定的區間內。

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 row to select the columns,以及如何將函數應用於 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))也會產生同樣的結果。

你不需要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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM