R语言 将函数应用于每行,带条件

3ks5zfa0  于 2022-12-20  发布在  其他
关注(0)|答案(3)|浏览(166)

我不明白为什么这段代码不工作。我觉得我错过了一个非常简单的概念。

#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)
w3nuxt5m

w3nuxt5m1#

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
ldioqlga

ldioqlga2#

如上所述,map适用于列表或向量。另外,您的函数有三个参数,因此pmap最好传递这些参数。您可以将df设置为要Map的列表(在这两种情况下,其工作原理与传递tibble - list输出相同,只传递结果):

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
zfycwa2u

zfycwa2u3#

pmap(df[,-4], simple_as_hello_world)

map针对向量工作,而pmap(parallel map)迭代多个向量(在本例中为 Dataframe 的列)并针对x[1]、y[1]、z[1]运行函数;然后是x[2]、y[2]、z[2]等。
同样,你的“var 1”和“var 2”不是数字,它们是字符串。在尝试添加它们之前转换为数字。

相关问题