Репликация Base R Операция в dplyr - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь реплицировать набор операций, используя dplyr, и по какой-то причине моя попытка не дает таких же результатов. Мой вопрос состоит в двух вещах: 1. Почему версия dplyr, которую я написал, не приводит к тому же результату, что и базовая операция, и 2. Какова самая ясная реализация dplyr (piping). Сначала приведем несколько примеров данных, которые представляют собой меньший масштаб моей собственной проблемы:

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)

Что здесь происходит?!?

Ответы [ 2 ]

3 голосов
/ 29 апреля 2019

Похоже, вы используете d в решении dplyr, но не в base, и использование (abc[rand, "a"] < e) является основным отличием, поскольку в dplyr решении вы можете просто использовать a < e.Ниже я только что попытался воссоздать ваше base r решение в dplyr.И, кажется, работает

Идентификатор строки отличается, хотя из-за 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

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 голосов
/ 29 апреля 2019

Я думаю, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...