使用mutate和replace取整-dplyr

时间:2019-03-27 10:26:49

标签: r dplyr rounding

我有以下数据:

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))

我想在dplyr中使用mutatereplace来舍入一些行,但不舍入其他行。这是我的代码:

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 :(得分:0)

与使用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替换。因此,它期望listvalues的长度相等。如果没有,它们将被回收。

在您的情况下,让我们仔细看看第一个替换项,因为第二个替换项本质上是相同的。尽管起初看起来两个向量(region == 'all' & place !='two'round(figures/10)*10)的长度相同,但实际上它们不只是TRUE个计数的两个region == 'all' & place !='two'值。这样,您会收到警告消息,因为您试图使用四个值(round(figures/10)*10)来替换两个值。