仅使用dplyr突变数值列的值,并且仅对数据帧的第一行和最后一行进行突变

时间:2018-07-27 04:32:12

标签: r dplyr

给出如下数据框:

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_atmutate_if一次对所有数字列执行此操作。你能帮我吗?

1 个答案:

答案 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_ifis.numeric用作.predicate参数。