[英]Mutate value only for numeric columns AND only in the first and last row of a data frame using dplyr
Given a data frame like: 给定一个数据框,例如:
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)
)
I would like to use dplyr
to change the value of the first and last row, and only in numeric columns. 我想使用
dplyr
更改第一行和最后一行的值,并且仅在数字列中。
I can do it for one column, as in: 我可以在一列中执行此操作,如下所示:
df %>%
mutate(V1 = ifelse(row_number()==1, mean(V1)*100, V1)) %>%
mutate(V1 = ifelse(row_number()==nrow(.), mean(V1)*100, V1))
However I cannot manage to find a way to use mutate_at
or mutate_if
to do that for all numeric columns at once. 但是,我无法找到一种方法来使用
mutate_at
或mutate_if
一次对所有数字列执行此操作。 Could you help me with that? 你能帮我吗?
I think this addresses your issue: 我认为这可以解决您的问题:
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
If you'd like to do it on all numeric columns, you can just use mutate_if
with is.numeric
as the .predicate
argument. 如果要在所有数字列上执行此操作,则可以仅将
mutate_if
与is.numeric
用作.predicate
参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.