给出如下数据框:
library(dplyr)
library(lubridate)
df <- data.frame(
date = seq(ymd('2018-01-01'), ymd('2018-01-10'), by = 'days'),
location = "AMS",
V1 = seq(1:10),
V2 = seq(11:20)
)
我想使用dplyr
来更改第一行和最后一行的值,并且仅在数字列中。
我可以在一列中完成它,如:
df %>%
mutate(V1 = ifelse(row_number()==1, mean(V1)*100, V1)) %>%
mutate(V1 = ifelse(row_number()==nrow(.), mean(V1)*100, V1))
但是,我无法找到一种方法来使用mutate_at
或mutate_if
一次对所有数字列执行此操作。你能帮我吗?
答案 0 :(得分:1)
我认为这可以解决您的问题:
df <- data.frame(
date = seq(ymd('2018-01-01'), ymd('2018-01-10'), by = 'days'),
location = "AMS",
V1 = 1:10,
V2 = 11:20
)
df %>% mutate_at(vars(V1, V2),
funs(ifelse(row_number() %in% c(1, n()), mean(.)*100, .)))
date location V1 V2
1 2018-01-01 AMS 550 1550
2 2018-01-02 AMS 2 12
3 2018-01-03 AMS 3 13
4 2018-01-04 AMS 4 14
5 2018-01-05 AMS 5 15
6 2018-01-06 AMS 6 16
7 2018-01-07 AMS 7 17
8 2018-01-08 AMS 8 18
9 2018-01-09 AMS 9 19
10 2018-01-10 AMS 550 1550
如果要在所有数字列上执行此操作,则可以仅将mutate_if
与is.numeric
用作.predicate
参数。