【问题标题】:Counting the number of months, quarters and counts from a cell using R使用 R 计算单元格的月数、季度数和计数
【发布时间】:2021-03-09 23:10:28
【问题描述】:

来自给定数据框 (df$desc) 示例的单元格包含以下内容:Month:High=Mar_May Low=Jul_Oct | Qtr:High=Q3

如何从上面给出的单元格生成字段(必填表)-

所需表格:

Fields                 Count
Month Count               4
Quarter Count             1
Month High Count          2
Month Low Count           2
Quarter High Count        1
Quarter Low Count         0

逻辑:

  1. 月数 - 4;因为我们在牢房里有 4 个月的时间,即 3 月、5 月、7 月和 10 月。
  2. 季度计数 - 1 ;因为我们在单元格上有 1 个季度,即 Q3
  3. 月高计数- 2;因为我们在设置为高的单元格上有 2 个月的时间
  4. 季度高计数- 1;因为我们在设置为高的单元格上有 1 个季度
  5. 月低计数- 2;因为我们在设置为低的单元格上有 2 个月的时间
  6. Qtr 低计数 - 0;因为我们在设置为低的单元格上有 0 Quarter

【问题讨论】:

  • 你能解释得出结果中每个数字的逻辑吗?真的不清楚
  • @Hobo 重新检查问题,我已经用逻辑编辑了它
  • 谢谢@InVinci,这更清楚了。您可以为每个学期指定任意数量的月份和季度(例如,您可以指定Month:High=Jan_Feb_Jun_Sep Low=Aug)吗?
  • 是的,@Hobo 可能存在任何组合,因为它依赖于任何输入数据集,并且可能具有任何可能的变化。逻辑需要健壮,以便自动化每个极端情况。
  • 在这种情况下,单元格看起来像:(Month:High=Jan_Feb_Jun_Sep Low=Aug |) 而在其他情况下,单元格看起来像:( | Qtr:High=Q2)

标签: r dataframe dplyr datatable stringr


【解决方案1】:

这样的事情似乎有效。它比实际需要的要长很多,以便您可以查看每个转换。

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

df <- data.frame(desc=c(
    'Month:High=Mar_May  Low=Jul_Oct | Qtr:High=Q3',
    'Month:High=Jan_Feb_Jun_Sep Low=Aug |',
    ' | Qtr:High=Q2',
    ' | Qtr:Low=Q2_Q3'
))

df %>% 
  # Split the month from the quarter, using the pipe
  separate(desc, into = c('MonthPart', 'QuarterPart'), sep = '\\|', remove = FALSE) %>%
  
  # Get the high and low parts for month and quarter
  # These will be NA where the values are missing
  mutate(HighMonth = str_extract(MonthPart, '(?<=High=)[^ ]+'),
         LowMonth = str_extract(MonthPart, '(?<=Low=)[^ ]+'),
         HighQuarter = str_extract(QuarterPart, '(?<=High=)[^ ]+'),
         LowQuarter = str_extract(QuarterPart, '(?<=Low=)[^ ]+')) %>%
  
  # Work out the number of months/quarters using the length of the string
  # e.g. each month is 3 characters plus the _ (add 1 because the last month
  # or quarter has no _)
  mutate(HighMonthCount = (nchar(HighMonth) + 1) / 4,
         LowMonthCount = (nchar(LowMonth) + 1) / 4,
         HighQuarterCount = (nchar(HighQuarter) + 1) / 3,
         LowQuarterCount = (nchar(LowQuarter) + 1) / 3) %>%
  
  # NAs to 0
  mutate_if(is.numeric, ~if_else(is.na(.), 0, .)) %>% 
  
  # Work out total month and quarter counts
  mutate(MonthCount = HighMonthCount + LowMonthCount,
         QuarterCount = HighQuarterCount + LowQuarterCount) %>% 
  
  # Just keep the columns of interest
  select(desc, contains('Count')) %>% 
  
  # Pivot to required format
  pivot_longer(!desc, names_to = 'Fields', values_to = 'Count')

【讨论】:

  • 让我试试你的 sn-p @Hobo
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
相关资源
最近更新 更多