我有以下数据:
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中使用mutate
和replace
来舍入一些行,但不舍入其他行。这是我的代码:
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
。我通常会忽略此操作,因为代码正在执行我想要的操作。但是,当将代码应用于较大的数据集时,舍入将停止工作,正如我期望的那样。
有人知道为什么会这样吗?
谢谢
答案 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
替换。因此,它期望list
和values
的长度相等。如果没有,它们将被回收。
在您的情况下,让我们仔细看看第一个替换项,因为第二个替换项本质上是相同的。尽管起初看起来两个向量(region == 'all' & place !='two'
和round(figures/10)*10
)的长度相同,但实际上它们不只是TRUE
个计数的两个region == 'all' & place !='two'
值。这样,您会收到警告消息,因为您试图使用四个值(round(figures/10)*10
)来替换两个值。