Умножение нескольких столбцов - PullRequest
0 голосов
/ 28 мая 2019

Я хочу умножить некоторые подсчеты в определенных местах (0-100, 0-12 и т. Д., Отдельные переменные столбцы) на количество дней, в течение которых подсчет присутствует (дней)

Вот примериз моих данных:

df <- structure(list(month = c("Apr", "Apr", "Aug", "Aug", "Aug", "Sep"
), Year = c(2018, 2018, 2018, 2018, 2018, 2018), First = 
 structure(c(17995, 
 17998, 17750, 17758, 17770, 17778), class = "Date"), Last = 
 structure(c(17999, 
 17998, 17750, 17761, 17771, 17778), class = "Date"), days = c(5, 
 1, 1, 4, 2, 1), `0-100` = c(1, 0, 1, 1, 1, 1), `0-12` = c(0, 
 0, 1, 1, 1, 1), `0-25` = c(1, 1, 1, 1, 1, 1), `0-50` = c(1, 0, 
1, 1, 1, 1)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", 
 "data.frame"))

Так что я думал что-то вроде:

df2 <- df %>%
  mutate("0-100b" = days * "0-100", "0-12b" = days * "0-12", "0-25b" = days * "0-25", "0-50b" = days * "0-25")

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

хорошо, отредактируйте имена столбцов:

colnames(df) <- c("month", "Year", "First", "Last" , "days", "V", "I", 
"II", "III")

df2 <- df %>%
mutate(Vb = days * V, Ib = days * I, IIb = days * 
       II, IIIb = days * III)

1 Ответ

1 голос
/ 29 мая 2019

Как я уже говорил выше, вы можете выбрать столбцы с неправильными именами, заключив их в обратные кавычки. Одно из мест, где изложены правила именования, находится в документах базовой функции make.names.

Самое простое решение с неправильными именами - просто создать данные с допустимыми именами для начала ... но на практике это не всегда возможно. Есть несколько способов изменить имена на действительные. Вышеупомянутый make.names делает это из символьного вектора.

Если вы работаете в большем конвейерном рабочем процессе, вы можете использовать rename_all с несколькими функциями манипуляции со строками: 1) преобразовать в нижний регистр, 2) заменить - на _ и 3) добавить x до любых начальных цифр. Вы также можете использовать janitor::clean_names, который очищает все имена во фрейме данных.

library(dplyr)

df %>%
  rename_all(~tolower(.) %>% 
               stringr::str_replace_all(., "\\-", "_") %>%
               stringr::str_replace("^\\b(?=\\d)", "x"))
# omitted: same names as below

С чистыми именами вы можете использовать mutate_at, выбирать столбцы и передавать ему функцию для умножения на days. Если вы используете именованный список, имя добавляется для создания новых столбцов вместо их замены.

df %>%
  janitor::clean_names() %>%
  mutate_at(vars(x0_100:x0_50), list(b = ~. * days))
#> # A tibble: 6 x 13
#>   month  year first      last        days x0_100 x0_12 x0_25 x0_50 x0_100_b
#>   <chr> <dbl> <date>     <date>     <dbl>  <dbl> <dbl> <dbl> <dbl>    <dbl>
#> 1 Apr    2018 2019-04-09 2019-04-13     5      1     0     1     1        5
#> 2 Apr    2018 2019-04-12 2019-04-12     1      0     0     1     0        0
#> 3 Aug    2018 2018-08-07 2018-08-07     1      1     1     1     1        1
#> 4 Aug    2018 2018-08-15 2018-08-18     4      1     1     1     1        4
#> 5 Aug    2018 2018-08-27 2018-08-28     2      1     1     1     1        2
#> 6 Sep    2018 2018-09-04 2018-09-04     1      1     1     1     1        1
#> # … with 3 more variables: x0_12_b <dbl>, x0_25_b <dbl>, x0_50_b <dbl>

В этом случае также может иметь смысл выбирать столбцы с помощью регулярного выражения:

df %>%
  janitor::clean_names() %>%
  mutate_at(vars(matches("^x\\d")), list(b = ~. * days))
# same output as above
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...