[英]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
包有一個解決方案,但將列var1和var2設置為數字,而不是字符。 只需刪除引號,或使用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.