【问题标题】:R Dataframe - How to count number of rows up to a certain point?R Dataframe - 如何计算到某个点的行数?
【发布时间】:2018-03-28 16:55:39
【问题描述】:

我目前的数据看起来像这样:

1   Saturday  Evening             16.2  235.84
2   Saturday  Evening             23.4  235.29
3   Saturday  Evening             29.4  232.79
4   Sunday   Evening             24.2  233.89
5   Sunday   Evening             24.2  233.66
6   Sunday   Evening             24.2  233.38
7   Sunday   Evening             24.2  232.99
8   Sunday   Evening             25.4  233.21
9   Sunday   Evening             26.8  232.37
10  Saturday    Night            25.6  231.55
11  Saturday     Night           24.4  231.19
12  Saturday     Night           24.4  231.63
13  Saturday     Night           24.4  231.71
14  Sunday     Night             25.2  231.23
15  Sunday     Night             25.2  231.23
14  Saturday     Night             25.2  231.23
15  Saturday    Night             25.2  231.23
15  Sunday    Night             25.2  231.23

df = structure(list(V2 = c("Saturday", "Saturday", "Saturday", "Sunday", 
"Sunday", "Sunday", "Sunday", "Sunday", "Sunday", "Saturday", 
"Saturday", "Saturday", "Saturday", "Sunday", "Sunday", "Saturday", 
"Saturday", "Sunday"), V3 = c("Evening", "Evening", "Evening", 
"Evening", "Evening", "Evening", "Evening", "Evening", "Evening", 
"Night", "Night", "Night", "Night", "Night", "Night", "Night", 
"Night", "Night"), V4 = c(16.2, 23.4, 29.4, 24.2, 24.2, 24.2, 
24.2, 25.4, 26.8, 25.6, 24.4, 24.4, 24.4, 25.2, 25.2, 25.2, 25.2, 
25.2), V5 = c(235.84, 235.29, 232.79, 233.89, 233.66, 233.38, 
232.99, 233.21, 232.37, 231.55, 231.19, 231.63, 231.71, 231.23, 
231.23, 231.23, 231.23, 231.23)), .Names = c("V2", "V3", "V4", 
"V5"), row.names = c(NA, -18L), class = "data.frame")

数据仅包括周六和周日,因此不连续(例如,上周日和下周六开始之间的数据/工作日缺失)。每个周末的数据数量各不相同,因此我需要计算每个周六周日集合中有多少观察值。假设数据从周六到周日开始,然后又到下一组周六到周日,如何统计每组数据并将其存储在向量中?

编辑:例如,使用上面的数据,我想要的输出将是一个包含以下值的向量:[9,6,3]

【问题讨论】:

  • 请分享您想要的输出。
  • 粗略的方式:r = rle(df$V2); tapply(r$lengths, rep(1:length(r$values), each=2, length.out=length(r$values)), sum)with(r, lengths[c(TRUE, FALSE)] + lengths[c(FALSE, TRUE)])

标签: r dataframe


【解决方案1】:

使用dplyr 解决方案,其中V2 是您当前的天数列:

library(dplyr)
df %>%
  mutate(x = lag(cumsum((V2 == 'Sunday' & lead(V2) == 'Saturday')), default = 0)) %>%
  group_by(x) %>%
  summarise(z = n()) %>%
  select(z)

这会产生

      z
  <int>
1     9
2     6
3     3

【讨论】:

  • 感谢您的出色解决方案!
  • 我正在尝试修改您的解决方案以在工作日做同样的事情,但现在的问题是我的工作日数据从星期四开始,而不是第一组的星期一,它也没有结束周五为最后一组。我该怎么做呢?
  • 没关系!即使数据不是从星期一开始或在星期五结束,您的解决方案也能正常工作!
【解决方案2】:

我喜欢将包 data.table 用于这样的事情。下面是一个例子。

  install.packages ("data.table")
  library (data.table)

  foo = structure(list(V2 = c("Saturday", "Saturday", "Saturday", "Sunday", 
                       "Sunday", "Sunday", "Sunday", "Sunday", "Sunday", "Saturday", 
                       "Saturday", "Saturday", "Saturday", "Sunday", "Sunday", "Saturday", 
                       "Saturday", "Sunday"), V3 = c("Evening", "Evening", "Evening", 
                                                     "Evening", "Evening", "Evening", "Evening", "Evening", "Evening", 
                                                     "Night", "Night", "Night", "Night", "Night", "Night", "Night", 
                                                     "Night", "Night"), V4 = c(16.2, 23.4, 29.4, 24.2, 24.2, 24.2, 
                                                                               24.2, 25.4, 26.8, 25.6, 24.4, 24.4, 24.4, 25.2, 25.2, 25.2, 25.2, 
                                                                               25.2), V5 = c(235.84, 235.29, 232.79, 233.89, 233.66, 233.38, 
                                                                                             232.99, 233.21, 232.37, 231.55, 231.19, 231.63, 231.71, 231.23, 
                                                                                             231.23, 231.23, 231.23, 231.23)), .Names = c("V2", "V3", "V4", 
                                                                                                                                          "V5"), row.names = c(NA, -18L), class = "data.frame")

  foo <- as.data.table (foo) #convert to a datatable
  nrow (subset (foo, V2 == "Saturday")) #count how many rows are Saturday
  nrow (subset (foo, V2 == "Sunday")) #count how many rows are Sunday
  nrow (subset (foo, V2 == "Saturday" & V3 == "Evening")) #count how many rows are Saturday Evening
  nrow (subset (foo, V2 == "Saturday" & V3 == "Evening" | V3 == "Night")) #count how many rows are Saturday Evening and Night

【讨论】:

    猜你喜欢
    • 2017-04-06
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多