R中的加窗时域统计:如何加窗一列并将统计方法应用于其他列
我在R中有以下数据帧:R中的加窗时域统计:如何加窗一列并将统计方法应用于其他列,r,dataframe,dplyr,data.table,time-series,R,Dataframe,Dplyr,Data.table,Time Series,我在R中有以下数据帧: Time A 1 1 2 1 3 1 4 1 5 2 6 2 7 3 8 3 9 2 10 1 11 1 12 1 13 3 14 3 15 3 让我们考虑“代码>时间列中的第二个,我需要定义一个3秒的窗口,并将两个或三个不同的方法应
Time A
1 1
2 1
3 1
4 1
5 2
6 2
7 3
8 3
9 2
10 1
11 1
12 1
13 3
14 3
15 3
让我们考虑“代码>时间<代码>列中的第二个,我需要定义一个3秒的窗口,并将两个或三个不同的方法应用到<代码> A < /代码>列,并在单独的列中显示每个函数的结果,让我们考虑第一个函数是平均的,第二个函数是max,像这样:
Time-window average max
1 1 1
2 2.5 2
3 4 3
4 1 1
4 3 3
如何使用任何可用的库在R中执行此操作。创建一个应用所有所需函数的函数
apply_fun <- function(x) {
c(mean = mean(x), max = max(x))
}
apply\u-fun创建一个应用所有需要的函数的函数
apply_fun <- function(x) {
c(mean = mean(x), max = max(x))
}
apply_fun如果您更喜欢dplyr
,您可以执行以下操作:
df %>%
group_by(time_window = ceiling(Time/3)) %>%
summarise_at(2, list(mean = mean, max = max))
time_window mean max
<fct> <dbl> <int>
1 1 1 1
2 2 1.67 2
3 3 2.67 3
4 4 1 1
5 5 3 3
如果您更喜欢dplyr
,可以执行以下操作:
df %>%
group_by(time_window = ceiling(Time/3)) %>%
summarise_at(2, list(mean = mean, max = max))
time_window mean max
<fct> <dbl> <int>
1 1 1 1
2 2 1.67 2
3 3 2.67 3
4 4 1 1
5 5 3 3
A数据表
解决方案
library(data.table)
dat <- setDT(dat)
dat2 <- dat[, `Time-window` := rep(1:(.N/3), each = 3)][
, .(average = mean(A), max = max(A)), by = `Time-window`
]
dat2
# Time-window average max
# 1: 1 1.000000 1
# 2: 2 1.666667 2
# 3: 3 2.666667 3
# 4: 4 1.000000 1
# 5: 5 3.000000 3
库(data.table)
datAdata.表
solution
library(data.table)
dat <- setDT(dat)
dat2 <- dat[, `Time-window` := rep(1:(.N/3), each = 3)][
, .(average = mean(A), max = max(A)), by = `Time-window`
]
dat2
# Time-window average max
# 1: 1 1.000000 1
# 2: 2 1.666667 2
# 3: 3 2.666667 3
# 4: 4 1.000000 1
# 5: 5 3.000000 3
库(data.table)
到目前为止你试了什么?你有没有这样的链接?到目前为止你尝试了什么?你有没有这样的链接,比如,,dat[,(average=mean(A),max=max(A)),by=。(“时间窗口”=rep(1:(.N/3),each=3))
?谢谢,如果不是将窗口长度作为行数,而是将其作为时间,例如每0.2秒,我知道它可能不适用于此example@jangorecki谢谢分享。现在我看到我们可以通过
参数直接在中创建一个新列。这很酷。@chessoapiens每隔0.2秒不适用于此示例,因为您说过您的时间步长是秒,并且每0.2秒小于此值。但是,如果您能够找到一种方法来创建时间窗口,它应该可以工作。也许dat[,(average=mean(a),max=max(a)),by=。(“时间窗口”=rep(1:(.N/3),each=3))]
?谢谢,如果不是将窗口长度作为行数,而是将其作为时间,例如每0.2秒,我知道它可能不适用于此example@jangorecki谢谢分享。现在我看到我们可以通过
参数直接在中创建一个新列。这很酷。@chessoapiens每隔0.2秒不适用于此示例,因为您说过您的时间步长是秒,并且每0.2秒小于此值。但是,如果你能找到一种方法来创建时间窗口
列,它应该可以工作。谢谢,我需要添加一个小东西,如果我想在组列中为每个窗口设置开始秒,该怎么办?例如1 3 6 912@chessosapiens您可以将df$Time[match(unique(df$group),df$group)]
添加到最终输出数据帧中。我可能需要对我的原始问题进行编辑,我如何定义窗口长度,而不是基于行数,而是基于值,例如,我可能希望时间窗口为0.2秒。@chessosapiens,您可能需要使用cut
或findInterval
根据time
值将其划分为多个部分。类似于下面的感谢,我需要添加一个小东西,如果我想在组列中为每个窗口设置开始秒,该怎么办?例如1 3 6 912@chessosapiens您可以将df$Time[match(unique(df$group),df$group)]
添加到最终输出数据帧中。我可能需要对我的原始问题进行编辑,我如何定义窗口长度,而不是基于行数,而是基于值,例如,我可能希望时间窗口为0.2秒。@chessosapiens,您可能需要使用cut
或findInterval
根据time
值将其划分为多个部分。类似于下面的内容,谢谢,如果不是将窗口长度作为行数,而是将其作为时间,例如每0.2秒一次,我知道它可能不适用于此示例。如果您的行代表0.2秒,则可以应用相同的原则。否则,我真的说不出你是什么意思。假设每行时差为0.014秒,我希望窗口长度为0.2秒,你可以尝试重置累积和。在达到0.2秒后重置。谢谢,如果不是将窗口长度作为行数,而是将其作为时间,例如每0.2秒重置一次,我知道它可能不适用于此示例。如果有行表示0.2秒,则可以应用相同的原则。否则,我真的说不出你是什么意思。假设每行时差为0.014秒,我希望窗口长度为0.2秒,你可以尝试重置累积和。达到0.2秒后重置。