【问题标题】:Using purrr for rowwise operations使用 purrr 进行行操作
【发布时间】:2020-08-30 02:41:30
【问题描述】:

我希望将 purrr 用于逐行操作,其中每个元素在函数中用作字符串。我得到的错误是它不能将 $ 归因于原子向量。这是一个例子:

test_function = function(dat_) {
  
  petal_width = dat_$Petal.Width
  sepal_width = dat_$Sepal.Width
  petal_length = dat_$Petal.Length
  sepal_length = dat_$Sepal.Length
  
  list(petal_length,sepal_length,sepal_width,petal_width) %>%
    bind_cols -> test
  
  return(test)
  
}

apply(iris, 1, test_function)

【问题讨论】:

  • 你在哪里使用purrr?这里的一切似乎都是dplyr 和基础 R。(顺便说一句:apply(iris,1,...) 正在将所有列转换为 character,可能不是您想要/需要的。)
  • 我希望通过 purrr 来执行此操作。我不知道从哪里开始。
  • 不清楚您期望的输出是什么。而purrr 是一个包含许多功能的包,其中一些可能在逐行情况下很有用。
  • 这是一个玩具示例。在这里,输出将重新创建原始集。它将获取每一行,分配其每一列,然后将新元素绑定在一起。

标签: r dplyr purrr


【解决方案1】:

不确定您的预期输出是什么,但您可以使用 pmap 执行逐行操作。但是,pmap 将每一行作为向量而不是作为数据框传递,因此 $ 将不起作用。您可以将功能更改为:

library(tidyverse)

test_function = function(dat_) {

  petal_width = dat_[['Petal.Width']]
  sepal_width = dat_[['Sepal.Width']]
  petal_length = dat_[['Petal.Length']]
  sepal_length = dat_[['Sepal.Length']]
  tibble(a = petal_length,b = sepal_length,
         c = sepal_width,d = petal_width) -> test
  return(test)
}

您可以将pmap 用作:

iris %>% mutate(data = pmap(select(., matches('Sepal|Petal')), 
               ~test_function(c(...)))) -> tmp

每一行数据都是一个包含该行数据的小标题。

tmp$data[[1]]
# A tibble: 1 x 4
      a     b     c     d
  <dbl> <dbl> <dbl> <dbl>
1   1.4   5.1   3.5   0.2

【讨论】:

    猜你喜欢
    • 2019-12-04
    • 2019-12-13
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多