在标题中带有常用字符的数据框中添加列值

时间:2019-03-29 14:54:33

标签: r dataframe grep

我有一个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的列添加到新列“ bookings”中

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)))

我还没有找到有效的语法。

编辑:

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 个答案:

答案 0 :(得分:2)

使用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(.)]))

答案 1 :(得分:0)

我们可以获取除第一列之外的其他列中的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”作为列名子字符串的列,然后在{{ 1}}创建“预订”

+

或者另一个选择是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

答案 2 :(得分:0)

使用sapply

df = data.frame(df[,1],
                "bookings" = sapply(1:nrow(df), function(x) sum(df[x, grep('pax', colnames(df))])))