【问题标题】:applying cut() on R dataframe daywise每天在 R 数据帧上应用 cut()
【发布时间】:2020-05-31 18:40:12
【问题描述】:

我在 R 中有一个数据表,我在其上应用了 cut()table()。我能够根据条件获得频率表。但我得到了整体频率。我想明智地得到它。我有一个名为timestamp 的列,它有时间戳。我还有一个section 列,其值为AB。如何根据每一天每一节来剪。

我目前的输出:

Var1    Freq
0-30    1398
30-60   1051
60-80   1006
80-100  36
100>    2

预期输出:

Date        Sec  Var1    Freq
05-01-2020   A   0-30    1398
05-01-2020   A   30-60   1051
05-01-2020   A   60-80   1006
05-01-2020   A   80-100  36
05-01-2020   A   100>    2
05-01-2020   B   0-30    138
05-01-2020   B   30-60   151
05-01-2020   B   60-80   1056
05-01-2020   B   80-100  3
05-01-2020   B   100>    6
06-01-2020   A   0-30    398
06-01-2020   A   30-60   11
06-01-2020   A   60-80   16
06-01-2020   A   80-100  3666
06-01-2020   A   100>    25
06-01-2020   B   0-30    1948
06-01-2020   B   30-60   233
06-01-2020   B   60-80   33
06-01-2020   B   80-100  433
06-01-2020   B   100>    34
and so on.....

我的代码:

result = as.data.frame(table(cut(df$temp,breaks=c(0,30,60,80,100,1000),labels=c("0-30","30-60","60-80","80-100","100>"))))

样本数据:

timestamp        section    temp
01-05-2020 00:01:22 A   45
02-05-2020 00:01:22 A   10
03-05-2020 00:01:22 A   98
04-05-2020 00:01:22 A   23
05-05-2020 00:01:22 A   67
06-05-2020 00:01:22 A   89
07-05-2020 00:01:22 A   100
08-05-2020 00:01:22 A   110
09-05-2020 00:01:22 A   123
10-05-2020 00:01:22 A   12
01-05-2020 00:01:22 B   23
02-05-2020 00:01:22 B   44
03-05-2020 00:01:22 B   55
04-05-2020 00:01:22 B   12
05-05-2020 00:01:22 B   98
06-05-2020 00:01:22 B   45
07-05-2020 00:01:22 B   87
08-05-2020 00:01:22 B   65
09-05-2020 00:01:22 B   12
10-05-2020 00:01:22 B   8

【问题讨论】:

  • 你的意见是什么
  • 输入是一个3列的数据表。 timestampsectiontempsectionAB always 和 temp 是温度范围从 0 到 150
  • 你能帮我解决这个问题吗?
  • 在您的 df$temp 中,'temp' 是什么
  • temp column.... 对应于温度的列。

标签: r data.table


【解决方案1】:

这是一种选择。我们按“日期”和“临时”列上的cut 进行分组,然后通过summarise 得到n() 的频率

library(dplyr)
library(lubridate)
df %>%
    group_by(Date = as.Date(dmy_hms(timestamp)), section,
     Var1 = cut(temp, breaks=c(0,30,60,80,100,1000),
           labels=c("0-30","30-60","60-80", "80-100", "100>"))) %>%
    summarise(Freq = n())
# A tibble: 20 x 4
# Groups:   Date, section [20]
#   Date       section Var1    Freq
#   <date>     <chr>   <fct>  <int>
# 1 2020-05-01 A       30-60      1
# 2 2020-05-01 B       0-30       1
# 3 2020-05-02 A       0-30       1
# 4 2020-05-02 B       30-60      1
# 5 2020-05-03 A       80-100     1
# 6 2020-05-03 B       30-60      1
# 7 2020-05-04 A       0-30       1
# 8 2020-05-04 B       0-30       1
# 9 2020-05-05 A       60-80      1
#10 2020-05-05 B       80-100     1
#11 2020-05-06 A       80-100     1
#12 2020-05-06 B       30-60      1
#13 2020-05-07 A       80-100     1
#14 2020-05-07 B       80-100     1
#15 2020-05-08 A       100>       1
#16 2020-05-08 B       60-80      1
#17 2020-05-09 A       100>       1
#18 2020-05-09 B       0-30       1
#19 2020-05-10 A       0-30       1
#20 2020-05-10 B       0-30       1

数据

df <- structure(list(timestamp = c("01-05-2020 00:01:22", "02-05-2020 00:01:22", 
"03-05-2020 00:01:22", "04-05-2020 00:01:22", "05-05-2020 00:01:22", 
"06-05-2020 00:01:22", "07-05-2020 00:01:22", "08-05-2020 00:01:22", 
"09-05-2020 00:01:22", "10-05-2020 00:01:22", "01-05-2020 00:01:22", 
"02-05-2020 00:01:22", "03-05-2020 00:01:22", "04-05-2020 00:01:22", 
"05-05-2020 00:01:22", "06-05-2020 00:01:22", "07-05-2020 00:01:22", 
"08-05-2020 00:01:22", "09-05-2020 00:01:22", "10-05-2020 00:01:22"
), section = c("A", "A", "A", "A", "A", "A", "A", "A", "A", "A", 
"B", "B", "B", "B", "B", "B", "B", "B", "B", "B"), temp = c(45L, 
10L, 98L, 23L, 67L, 89L, 100L, 110L, 123L, 12L, 23L, 44L, 55L, 
12L, 98L, 45L, 87L, 65L, 12L, 8L)), class = "data.frame", row.names = c(NA, 
-20L))

【讨论】:

  • 请看我的样本数据。同一天不同时间我们会有不同的温度。我需要将它分组到这些范围中并获取每个范围、每个部分、每天的计数。
  • @VJD 请检查我的更新。我将其转换为日期时间,然后单独获取日期
  • 我正在获取部分、时间戳和温度本身......并且没有每天每个部分的计数摘要
  • @VJD 我更新了代码Date = as.Date(dmy_hms(timestamp))
  • @VJD 总结后,步骤%&gt;% ungroup %&gt;% na.omit
【解决方案2】:

此问题已标记为data.table。所以,为了完整起见,这里也是data.table的解决方案:

library(data.table)
setDT(df)[, .(Freq = .N), 
          by = .(Date = as.IDate(timestamp, "%d-%m-%Y"), section,
                 Var1 = cut(temp, c(0, 30, 60, 80, 100, Inf), c("0-30", "30-60", "60-80", "80-100", "100>")))]
          Date section   Var1 Freq
 1: 2020-05-01       A  30-60    1
 2: 2020-05-02       A   0-30    1
 3: 2020-05-03       A 80-100    1
 4: 2020-05-04       A   0-30    1
 5: 2020-05-05       A  60-80    1
 6: 2020-05-06       A 80-100    1
 7: 2020-05-07       A 80-100    1
 8: 2020-05-08       A   100>    1
 9: 2020-05-09       A   100>    1
10: 2020-05-10       A   0-30    1
11: 2020-05-01       B   0-30    1
12: 2020-05-02       B  30-60    1
13: 2020-05-03       B  30-60    1
14: 2020-05-04       B   0-30    1
15: 2020-05-05       B 80-100    1
16: 2020-05-06       B  30-60    1
17: 2020-05-07       B 80-100    1
18: 2020-05-08       B  60-80    1
19: 2020-05-09       B   0-30    1
20: 2020-05-10       B   0-30    1

或者,以更程序化的方式

breaks <- c(0, 30, 60, 80, 100, Inf)
labels <- stringr::str_replace(paste(head(breaks, -1L), tail(breaks, -1L), sep = "-"), "-Inf", ">")
setDT(df)[, .(Freq = .N), by = .(Date = as.IDate(timestamp, "%d-%m-%Y"), section,
                                 Var1 = cut(temp, breaks, labels))]

数据

library(data.table)
df <- fread(
  "timestamp time       section    temp
01-05-2020 00:01:22 A   45
02-05-2020 00:01:22 A   10
03-05-2020 00:01:22 A   98
04-05-2020 00:01:22 A   23
05-05-2020 00:01:22 A   67
06-05-2020 00:01:22 A   89
07-05-2020 00:01:22 A   100
08-05-2020 00:01:22 A   110
09-05-2020 00:01:22 A   123
10-05-2020 00:01:22 A   12
01-05-2020 00:01:22 B   23
02-05-2020 00:01:22 B   44
03-05-2020 00:01:22 B   55
04-05-2020 00:01:22 B   12
05-05-2020 00:01:22 B   98
06-05-2020 00:01:22 B   45
07-05-2020 00:01:22 B   87
08-05-2020 00:01:22 B   65
09-05-2020 00:01:22 B   12
10-05-2020 00:01:22 B   8")[
  , c("timestamp", "time") := .(paste(timestamp, time), NULL)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多