【问题标题】:Replicate Base R Operation in dplyr在 dplyr 中复制 Base R 操作
【发布时间】:2019-04-29 08:38:35
【问题描述】:

我正在尝试使用 dplyr 复制一组操作,但由于某种原因,我的尝试没有达到相同的结果。我的问题是两件事:1.为什么我编写的 dplyr 版本不会产生与基本操作相同的结果,以及 2.什么是最清晰的 dplyr(管道)实现。首先这里是一些我自己的问题规模较小的示例数据:

abc <- data.frame(a = rnorm(100, 5, 6), b = rnorm(100, 2, 3), c = rnorm(100, 0, 5), d = rnorm(100, 50, 3))
rand <- sample(c(1:100), 100, replace = F)
e <- 5
f <- 50

以下是base R中的情况。

# Case 1 
abc.2 <- abc[rand,][(rand <= f) | (abc[rand, "a"] < e),]

这是我使用dplyr的尝试,但是abc.3的结果和abc.2不同

# Case 2

abc.3 <- abc[rand,]
abc.3 <- abc.3 %>% filter(d >= f | d < e)

这是怎么回事?!?

【问题讨论】:

  • 不幸的是,您的基本示例也不起作用。
  • 确实如此,我只是运行它并正确地对数据进行子集化。
  • 怎么样? abc[d, "a"] 除了abc$d 之外,没有d 对象。
  • 我编辑了它。它应该是 abc[rand, "a"]。是错别字
  • 当 abc 使用 rand 排序时,保留小于 e 的行。

标签: r dplyr


【解决方案1】:

您似乎在dplyr 解决方案中使用d,但在base 中没有使用 并且您对(abc[rand, "a"] &lt; e) 的使用是与dplyr 解决方案中的主要区别,您可以只使用a &lt; e。下面我刚刚尝试在dplyr 中重新创建您的base r 解决方案。它似乎有效

由于 dplyr 处理数据帧,行 id 有所不同

abc <- data.frame(a = rnorm(100, 5, 6), b = rnorm(100, 2, 3), c = rnorm(100, 0, 5), d = rnorm(100, 50, 3))
rand <- sample(c(1:100), 100, replace = F)
e <- 5
f <- 50

abc.2 <- abc[rand,][(rand <= f) | (abc[rand, "a"] < e),]

abc.3 <- abc[rand,]
abc.3 <- abc.3 %>% filter(rand <= f | a < e)


> all.equal(abc.2$a, abc.3$a)
[1] TRUE
> all.equal(abc.2$b, abc.3$b)
[1] TRUE
> all.equal(abc.2$c, abc.3$c)
[1] TRUE
> all.equal(abc.2$d, abc.3$d)
[1] TRUE
> all.equal(abc.2, abc.3)
[1] "Attributes: < Component “row.names”: Mean relative difference: 0.7186996 >"

【讨论】:

    【解决方案2】:

    我认为dplyr 版本将使用slice

    library(dplyr)
    abc. 3 <- abc %>% slice(rand[(rand <= f) | (a[rand] < e)])
    

    我们可以比较输出

    head(abc.2)
    #            a          b           c        d
    #5   4.1933216 1.89493799   0.1185014 50.17590
    #59 -0.8447520 0.02859712  -8.5168739 49.04809
    #32 12.9969641 5.17795376  -6.0270349 50.63730
    #52 -0.5149191 4.01784805   0.8158744 50.88895
    #28  7.4209741 2.71737567  -0.7756451 48.84768
    #37 11.9426428 3.67445186 -10.7043711 49.88126
    
    head(abc.3)
    #           a          b           c        d
    #1  4.1933216 1.89493799   0.1185014 50.17590
    #2 -0.8447520 0.02859712  -8.5168739 49.04809
    #3 12.9969641 5.17795376  -6.0270349 50.63730
    #4 -0.5149191 4.01784805   0.8158744 50.88895
    #5  7.4209741 2.71737567  -0.7756451 48.84768
    #6 11.9426428 3.67445186 -10.7043711 49.88126
    
    tail(abc.2)
    #            a           b          c        d
    #43  1.2259801 -0.09873229  3.4330413 54.19566
    #10 12.5498938  3.03150006  7.2630499 50.08077
    #49 -2.5949440 -1.65535917  7.6826515 46.42876
    #80 -0.1063651 -0.81405361 -0.5607432 51.30927
    #18  0.8502235  3.22688781 -3.4557019 53.39594
    #22  1.8523659  7.89332620 -3.3389127 47.00231
    
    tail(abc.3)
    #            a           b          c        d
    #73  1.2259801 -0.09873229  3.4330413 54.19566
    #74 12.5498938  3.03150006  7.2630499 50.08077
    #75 -2.5949440 -1.65535917  7.6826515 46.42876
    #76 -0.1063651 -0.81405361 -0.5607432 51.30927
    #77  0.8502235  3.22688781 -3.4557019 53.39594
    #78  1.8523659  7.89332620 -3.3389127 47.00231
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      • 1970-01-01
      • 2019-09-15
      • 1970-01-01
      相关资源
      最近更新 更多