Можно ли использовать ограниченный вариант transmute и сохранить первый столбец в dplyr? - PullRequest
1 голос
/ 07 февраля 2020

Вопрос

Я регулярно использую данные временных рядов. Иногда я хотел бы преобразовать весь фрейм данных, чтобы получить некоторый фрейм данных о темпах роста или долях, например.

При использовании transmute это относительно просто. Но когда мне нужно преобразовать много столбцов и я хочу сохранить столбец даты, я не уверен, возможно ли это.

Ниже, с использованием набора данных economics, приведен пример среднее.

Пример

library(dplyr)    
economics %>% 
  transmute(date, 
            pce * 10, 
            pop * 10, 
            psavert * 10)

# A tibble: 574 x 4
date       `pce * 10` `pop * 10` `psavert * 10`
<date>          <dbl>      <dbl>          <dbl>
1 1967-07-01       5067    1987120            126
2 1967-08-01       5098    1989110            126
3 1967-09-01       5156    1991130            119
4 1967-10-01       5122    1993110            129
5 1967-11-01       5174    1994980            128
6 1967-12-01       5251    1996570            118
7 1968-01-01       5309    1998080            117
8 1968-02-01       5336    1999200            123
9 1968-03-01       5443    2000560            117
10 1968-04-01       5440    2002080            123
# ... with 564 more rows

Теперь, используя transmute_at. Нижеприведенное предсказуемо удаляет date в аргументе .vars, но я не нашел способа удалить date и повторно ввести его в .funs так, чтобы результирующий кадр данных выглядел так же, как и выше. Есть идеи?

economics %>% 
  transmute_at(.vars = vars(-c(date, uempmed, unemploy)), 
               .funs = list("trans" = ~ . * 10))

# A tibble: 574 x 3
pce_trans pop_trans psavert_trans
<dbl>   <dbl>   <dbl>
1  5067 1987120     126
2  5098 1989110     126
3  5156 1991130     119
4  5122 1993110     129
5  5174 1994980     128
6  5251 1996570     118
7  5309 1998080     117
8  5336 1999200     123
9  5443 2000560     117
10  5440 2002080     123
# ... with 564 more rows

1 Ответ

1 голос
/ 07 февраля 2020

Мы можем использовать if/else внутри функции.

library(dplyr)
library(ggplot2)
data(economics)
economics %>% 
    transmute_at(vars(date:psavert), ~ if(is.numeric(.)) .* 10 else .)
# A tibble: 574 x 4
#  date         pce     pop psavert
#   <date>     <dbl>   <dbl>   <dbl>
# 1 1967-07-01  5067 1987120     126
# 2 1967-08-01  5098 1989110     126
# 3 1967-09-01  5156 1991130     119
# 4 1967-10-01  5122 1993110     129
# 5 1967-11-01  5174 1994980     128
# 6 1967-12-01  5251 1996570     118
# 7 1968-01-01  5309 1998080     117
# 8 1968-02-01  5336 1999200     123
# 9 1968-03-01  5443 2000560     117
#10 1968-04-01  5440 2002080     123
# … with 564 more rows

Если нам нужно выборочно изменить имена столбцов, можно сделать это после transmute_at

library(stringr)
economics %>% 
    transmute_at(vars(date:psavert), ~ if(is.numeric(.)) .* 10 else .) %>%
    rename_at(vars(-date), ~ str_c(., '_trans'))
# A tibble: 574 x 4
#   date       pce_trans pop_trans psavert_trans
#   <date>         <dbl>     <dbl>         <dbl>
# 1 1967-07-01      5067   1987120           126
# 2 1967-08-01      5098   1989110           126
# 3 1967-09-01      5156   1991130           119
# 4 1967-10-01      5122   1993110           129
# 5 1967-11-01      5174   1994980           128
# 6 1967-12-01      5251   1996570           118
# 7 1968-01-01      5309   1998080           117
# 8 1968-02-01      5336   1999200           123
# 9 1968-03-01      5443   2000560           117
#10 1968-04-01      5440   2002080           123
# … with 564 more rows

Если мы меняем имена столбцов во всех выбранных столбцы в transmute_at используют list(trans =

economics %>% 
   transmute_at(vars(date:psavert), list(trans = ~if(is.numeric(.)) .* 10 else .))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...