我有一个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]))
答案 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))])))