【问题标题】:What are R's equivalents to Perl's map and grep?R 与 Perl 的 map 和 grep 的等价物是什么?
【发布时间】:2011-03-24 05:34:15
【问题描述】:

我对@9​​87654324@ 中的(功能性)矢量操作很感兴趣。具体来说,R 与 Perl 的 mapgrep 的等价物是什么?

以下 Perl 脚本 greps 偶数数组元素并将它们乘以 2:

@a1=(1..8); 
@a2 = map {$_ * 2} grep {$_ % 2 == 0} @a1;
print join(" ", @a2)
# 4 8 12 16

如何在R 中做到这一点?我已经走到这一步了,使用 sapply 代替 Perl 的 map

> a1 <- c(1:8)
> sapply(a1, function(x){x * 2})
[1]  2  4  6  8 10 12 14 16

在哪里可以阅读更多关于 R 中此类函数式数组操作的信息?

另外,有没有类似于Perl Python PhrasebookPerlR 短语手册?

【问题讨论】:

    标签: r perl dictionary functional-programming


    【解决方案1】:

    快速的:

    • 除了sapply,基地里还有lapply()tapplybyaggregate等等。然后CRAN 上有很多附加包,例如plyr

    • 对于其他语言的基本函数式编程:Reduce()Map()Filter(),...所有这些都在同一个帮助页面上;尝试help(Reduce) 开始。

    • 如前面的答案所述,矢量化在这里更为合适。

    • 至于grep,R 实际上内置了三个正则表达式引擎,包括来自 libpcre 的基于 Perl 的版本。

    • 您似乎遗漏了 R 中的一些内容。我建议最近一本关于 R 和 S 语言的好书;我的建议是钱伯斯 (2008) "Software for Data Analysis"

    【讨论】:

      【解决方案2】:

      R 有“grep”,但它的工作方式与您习惯的完全不同。 R 内置了更好的东西:它能够使用布尔表达式创建数组切片:

      a1 <- c(1:8)
      a2 <- a1 [a1 %% 2 == 0]
      a2
      [1] 2 4 6 8
      

      对于地图,你可以像上面那样应用一个函数,但写起来要简单得多:

      a2 * 2
      [1]  4  8 12 16
      

      或一步到位:

      a1[a1 %% 2 == 0] * 2
      [1]  4  8 12 16
      

      我从未听说过 Perl 到 R 短语手册,如果你找到了请告诉我!一般来说,R 的文档比 perl 或 python 少,因为它是一种小众语言。

      【讨论】:

        猜你喜欢
        • 2011-09-14
        • 1970-01-01
        • 2018-07-11
        • 2012-03-20
        • 2011-03-25
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多