1

我有一个如下所示的数据框:

Type    June 23   June 24   July 23    July 24    August 23    August 24
 A         8        2          20         20           30         25
 B         8        2          20         20           30         25

现在我想得到每个月列的总和(所以忽略周数)。所以,结果应该是这样的

Type    June   July   August
 A       10     40      55        
 B       10     40      55

我尝试使用 dplyr 执行此操作,但我不知道如何仅匹配列名的第一部分。有谁知道如何做到这一点?

4

2 回答 2

2

暗示tidyverse宇宙的另一个可能的解决方案可能是

library(stringr)
library(tidyr)
library(dplyr)

dat %>% 
  pivot_longer(cols = -Type) %>% 
  mutate(Month = str_extract(name, "\\D+")) %>% 
  group_by(Type, Month) %>% 
  summarise(Sum = sum(value)) %>% 
  pivot_wider(id_cols = Type, names_from = Month, values_from = Sum)

输出

# A tibble: 2 x 4
# Groups:   Type [2]
#   Type  August  July  June
#   <chr>  <int> <int> <int>
# 1 A         55    40    10
# 2 B         55    40    10
于 2020-06-03T09:25:30.043 回答
2

在 base R 中,您可以使用split.default基于列名的相似部分来拆分数据。

在您的示例中,如果我们从列名中删除数字,我们会得到月份名称,将其传递给split.default每个部分并使用rowSums.

cbind(df[1],sapply(split.default(df[-1], sub('\\d+', '',names(df[-1]))), rowSums))

#  Type August July June
#1    A     55   40   10
#2    B     55   40   10

数据

df <- structure(list(Type = c("A", "B"), June23 = c(8L, 8L), June24 = c(2L, 
2L), July23 = c(20L, 20L), July24 = c(20L, 20L), August23 = c(30L, 
30L), August24 = c(25L, 25L)), class = "data.frame", row.names = c(NA, -2L))
于 2020-06-03T07:28:13.737 回答