首页 > 解决方案 > 在 dplyr 中复制 Base R 操作

问题描述

我正在尝试使用 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

以下是基础 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)

这里发生了什么?!?

标签: rdplyr

解决方案


看起来您在解决方案中使用,但ddplyr解决方案中没有base 使用,您使用(abc[rand, "a"] < e)的主要区别在于dplyr您可以使用的解决方案a < e。下面我刚刚尝试base rdplyr. 它似乎工作

由于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 >"

推荐阅读