Округление с использованием мутирования и замены - dplyr - PullRequest
1 голос
/ 27 марта 2019

У меня есть следующие данные:

library(dplyr)

d <- data_frame(
region = c('all', 'nj', 'rkl', 'all'),
place = c("one", "two","three", "four"),
figures= c(5, 7, 4, 8),
figures2 = c(3, 5, 6, 7))

Я хочу использовать mutate и replace в dplyr для округления некоторых строк, но не других.Вот мой код:

d %>%
  mutate(figures = replace(figures, region == 'all' & place !='two', 
round(d$figures/10)*10)) %>% 
  mutate(figures2 = replace(figures2, region == 'all' & place !='one', 
round(d$figures/10)*10)) -> d2

Это действительно то, что я хочу.Однако я получаю следующее предупреждение In x[list] <- values :number of items to replace is not a multiple of replacement length.Я обычно игнорировал бы это, поскольку код делает то, что я хочу.Однако при применении кода к большему набору данных округление перестает работать, как я ожидал.

Кто-нибудь знает, почему это может быть?

Спасибо

1 Ответ

0 голосов
/ 27 марта 2019

То, что вы на самом деле пытаетесь сделать, лучше обернуть в if_else, чем использовать replace:

d %>%
  mutate(figures = if_else(region == 'all' & place !='two', round(figures/10)*10, figures), 
         figures2 = if_else(region == 'all' & place !='one', round(figures/10)*10, figures2))

# A tibble: 4 x 4
#   region place figures figures2
#   <chr>  <chr>   <dbl>    <dbl>
# 1 all    one         0        3
# 2 nj     two         7        5
# 3 rkl    three       4        6
# 4 all    four       10       10

replace(x, list, values) аналогично x[list] <- values, но без изменения самого x,Таким образом, создается вектор, в котором значения x по индексам list заменяются на values.Таким образом, ожидается, что list и values имеют одинаковую длину.Если нет, они перерабатываются.

В вашем случае теперь давайте ближе рассмотрим первую замену, поскольку у второй, по сути, та же проблема.Хотя на первый взгляд кажется, что два вектора (region == 'all' & place !='two' и round(figures/10)*10) имеют одинаковую длину, на самом деле они отличаются не только от двух TRUE значений region == 'all' & place !='two'.Таким образом, вы получите предупреждение, потому что вы пытаетесь использовать четыре значения (round(figures/10)*10) для замены двух значений.

...