【问题标题】:Problem with mutate keyword and functions in RR中的mutate关键字和函数的问题
【发布时间】:2020-08-17 09:14:39
【问题描述】:

我在使用 MUTATE 时遇到问题,请检查下一个代码块。

output1 <- mytibble %>% 
  mutate(newfield = FND(mytibble$ndoc)) 
output1

其中 FND 函数是应用于大文件 (5GB) 的 FILTER:

FND <- function(n){
  result <- LARGETIBBLE %>% filter(LARGETIBBLE$id == n)
  return(paste(unique(result$somefield),collapse=" "))
}

我想对output1 tibble 的每一行执行FND 函数,但它只执行一次。

【问题讨论】:

  • 您可以删除LARGETIBBLE$ paste collapse 只返回一个字符串,该字符串会被回收。如果你能展示一个 10 -15 行和预期输出的小例子,那就太好了。此外,mytibble$ndoc 将只是 ndoc
  • Akrun,我想返回一个字符串,但每个 output1 行要返回很多次。
  • 您能否提供一个小例子,或者您希望我做几个小时的猜测工作
  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。我们不需要您的实际输入数据。只是允许使用运行和测试代码的东西。
  • 下次我会注意重复的例子,sr。我得到了答案:rowwise() 关键字。感谢您的宝贵时间。

标签: r function collapse dplyr tibble


【解决方案1】:

永远不要在dplyr 管道中使用$,很少使用它们。您可以将 FND 函数更改为:

library(dplyr)

FND <- function(n){
   LARGETIBBLE %>% filter(id == n) %>% pull(somefield)  %>% 
                  unique %>% paste(collapse = " ")
}

现在将此函数应用于mytibble 中的每个ndoc 值。

mytibble %>% mutate(newfield = purrr::map_chr(ndoc, FND))

你也可以使用sapply

mytibble$newfield <- sapply(mytibble$ndoc, FND)

【讨论】:

    【解决方案2】:

    FND(mytibble$ndoc)更适合数据帧。在 tibble 上使用 mutate 等函数时,无需指定 tibble 的名称,只需指定列的名称即可。符号%&gt;% 已经确保只使用来自 tibble 的数据。因此,您的示例将是:

    
    output1 <- mytibble %>% 
      mutate(newfield = FND(ndoc)) 
    
    FND <- function(n){
      result <- LARGETIBBLE %>% filter(id == n)
      return(paste(unique(result$somefield),collapse=" "))
    }
    
    

    理论上是这样,但是我不知道您的函数FND 是否可以工作,也许可以尝试一下,如果不行,请给出一些实际的数据示例以及您想要实现的目标。

    【讨论】:

    • 感谢您的回答,我会记录您的建议。最后,我使用 rowwise() 关键字得到了解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-08
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多