Добавление значений столбца в фрейм данных с общими символами в заголовке - PullRequest
1 голос
/ 29 марта 2019

У меня есть R dataFrame с несколькими столбцами. Я намереваюсь провести некоторую очистку данных, добавив вместе несколько столбцов, основываясь на наличии некоторых общих символов в заголовке.

простой пример

df

date               go_pax       full_pax       plus_pax
2019-03-11           7            23             14
2019-03-12           11            5              6
2019-03-13           20            4              37

ожидаемый результат: добавить все столбцы с символами pax в новый столбец «бронирования»

df_demand

date                bookings
2019-03-11           44
2019-03-12           22
2019-03-13           61

Я не использую простой

 df_demand <- data.frame("date" = df$date, "bookings" = df$gO_pax +  df$full_pax + df$pLUS_pax)

потому что столбцы с pax будут отличаться для разных входных данных.

Я пробовал что-то подобное

df_demand <- data.frame("date" = df$date, "bookings" = df$grep("pax", names(df)))

Я еще не нашел рабочий синтаксис.

Edit:

I need to put a logic such that I am adding columns with the characters pax

Я не буду использовать цифры для указания столбцов. Всего у меня есть более 20 столбцов.

Окончательное редактирование

Исходя из всех хороших ответов, это то, что мне помогло

pax <- grep("pax", names(df))
df_demand <- data.frame("date" = df$date, "bookings" = rowSums(df[pax]))

Ответы [ 3 ]

2 голосов
/ 29 марта 2019

С tidyverse вы можете попробовать:

df %>%
 select(date, contains("_pax")) %>%
 gather(var, val, -date) %>%
 group_by(date) %>%
 summarise(bookings = sum(val))

    date       bookings
  <chr>         <int>
1 2019-03-11       44
2 2019-03-12       22
3 2019-03-13       61

Или просто dplyr:

df %>%
 select(date, contains("_pax")) %>%
 transmute(date = date,
           bookings = rowSums(.[2:length(.)]))
0 голосов
/ 29 марта 2019

Использование sapply

df = data.frame(df[,1],
                "bookings" = sapply(1:nrow(df), function(x) sum(df[x, grep('pax', colnames(df))])))
0 голосов
/ 29 марта 2019

Мы можем получить rowSums столбцов, отличных от первого, и создать data.frame с первым столбцом исходного набора данных

data.frame(df1[1], bookings = rowSums(df1[-1]))
#         date bookings
#1 2019-03-11       44
#2 2019-03-12       22
#3 2019-03-13       61

Если нам нужно указать столбцы с 'pax'

nm1 <- grep("pax", names(df1))
data.frame(df1[1], bookings = rowSums(df1[nm1]))

Или другой base R вариант Reduce с +

data.frame(df1[1], bookings = Reduce(`+`, df1[nm1]))

Если нам нужен параметр tidyverse (без необходимости повторного изменения формы), selecg столбцы, в которых в качестве подстроки имен столбцов указано «pax», то используйте + в reduce для создания «бронирований». «

library(tidvyerse)
df1 %>% 
   transmute(date, bookings = select(., matches("pax")) %>% 
                 reduce(`+`))
#        date bookings
#1 2019-03-11       44
#2 2019-03-12       22
#3 2019-03-13       61

Или другой вариант rowSums, который мы впервые разместили здесь

df1 %>%
   transmute(date, bookings = rowSums(.[nm1]))
#        date bookings
#1 2019-03-11       44
#2 2019-03-12       22
#3 2019-03-13       61

Здесь нам не нужно менять форму, и это должно быть быстро

данные

df1 <- structure(list(date = c("2019-03-11", "2019-03-12", "2019-03-13"
 ), go_pax = c(7L, 11L, 20L), full_pax = c(23L, 5L, 4L), plus_pax = c(14L, 
 6L, 37L)), class = "data.frame", row.names = c(NA, -3L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...