簡體   English   中英

將函數應用於每一行,有條件

[英]Apply function to each row, with condition

我不明白為什么這段代碼不起作用。 我覺得我缺少一個非常簡單的概念。

#if(!require(tidyverse)) install.packages("tidyverse")

df <- tibble(rule = c("add", "add", "add", "sub"), var1 = c(1, 2, 3, 4), var2 = c(2, 3, 4, 5), result = 0)

simple_as_hello_world <- function(rule, var1, var2) {
  if (rule == "add") {result = var1 + var2}
  else {result = var1 - var2}
}

map(.x = df, .f = simple_as_hello_world)

dplyr包有一個解決方案,但將列var1var2設置為數字,而不是字符。 只需刪除引號,或使用as.numeric()函數。

library(dplyr)

df <- tibble(rule = c("add", "add", "add", "sub"), 
             var1 = c(1, 2, 3, 4), 
             var2 = c(2, 3, 4, 5))

df %>% 
  mutate(result = ifelse(rule == "add", var1 + var2, var1 - var2))
# A tibble: 4 x 4
  rule   var1  var2 result
  <chr> <dbl> <dbl>  <dbl>
1 add       1     2      3
2 add       2     3      5
3 add       3     4      7
4 sub       4     5     -1

map如前所述適用於列表或向量。 此外,您的函數需要三個參數,因此pmap最好傳遞這些參數。 您可以將df設為要映射的列表(與傳遞 tibble 的工作方式相同 - 在兩種情況下僅列出結果的列表輸出):

library(tidyverse)

df <-
  list(
    rule = c("add", "add", "add", "sub"),
    var1 = c("1", "2", "3", "4"),
    var2 = c("2", "3", "4", "5")
  )

simple_as_hello_world <- function(rule, var1, var2) {
  if (rule == "add") {
    result = as.integer(var1) + as.integer(var2)
  }
  else {
    result = as.integer(var1) - as.integer(var2)
  }
  result
}

pmap(df, .f = simple_as_hello_world)
#> [[1]]
#> [1] 3
#> 
#> [[2]]
#> [1] 5
#> 
#> [[3]]
#> [1] 7
#> 
#> [[4]]
#> [1] -1

或者在mutate中使用將相關元素傳遞給您的函數:

df <-
  tibble(
    rule = c("add", "add", "add", "sub"),
    var1 = c("1", "2", "3", "4"),
    var2 = c("2", "3", "4", "5")
  )

df |>
  mutate(result = pmap_int(list(rule, var1, var2), simple_as_hello_world))
#> # A tibble: 4 × 4
#>   rule  var1  var2  result
#>   <chr> <chr> <chr>  <int>
#> 1 add   1     2          3
#> 2 add   2     3          5
#> 3 add   3     4          7
#> 4 sub   4     5         -1
pmap(df[,-4], simple_as_hello_world)

map 適用於向量,而 pmap(平行地圖)遍歷多個向量(在本例中為數據框的列)並運行 x[1]、y[1]、z[1] 的函數; 然后是 x[2],y[2],z[2] 等等。

另外,您的“var1”和“var2”不是數字,它們是字符串。 在嘗試添加它們之前轉換為數字。

暫無
暫無

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

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