Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 利用时间元提取矢量名称_R - Fatal编程技术网

R 利用时间元提取矢量名称

R 利用时间元提取矢量名称,r,R,我编写这个循环是为了提取在一个时间间隔(bin)内发生的向量的每个元素的名称。我想知道我是否错过了一个更快的方法来做到这一点。。。我想对长度为1000秒的向量实现随机化,因此不希望依赖循环 mydata <- structure(c(1199.91666666667, 1200.5, 1204.63333333333, 1205.5, 1206.3, 1208.73333333333, 1209.06666666667, 1209.933333

我编写这个循环是为了提取在一个时间间隔(bin)内发生的向量的每个元素的名称。我想知道我是否错过了一个更快的方法来做到这一点。。。我想对长度为1000秒的向量实现随机化,因此不希望依赖循环

mydata <- structure(c(1199.91666666667, 1200.5, 1204.63333333333, 1205.5, 
                      1206.3, 1208.73333333333, 1209.06666666667, 1209.93333333333, 
                      1210.98333333333, 1214.56666666667, 1216.06666666667, 1216.63333333333, 
                      1216.91666666667, 1219.13333333333, 1221.35, 1221.51666666667, 
                      1225.35, 1225.53333333333, 1225.96666666667, 1227.61666666667, 
                      1228.91666666667, 1230.31666666667, 1233.53333333333, 1235.8, 
                      1237.51666666667, 1239.41666666667, 1241.6, 1247.08333333333, 
                      1247.45, 1252.7, 1253.26666666667), .Names = c("B", "A", "B", 
                                                                     "E", "A", "A", "B", "G", "G", "C", "A", "D", "E", "B", "B", "E", 
                                                                     "E", "G", "F", "A", "C", "A", "F", "B", "A", "F", "F", "G", "F", 
                                                                     "G", "F"))


mydata

      B        A        B        E        A        A        B        G        G        C        A        D        E        B        B        E        E 
1199.917 1200.500 1204.633 1205.500 1206.300 1208.733 1209.067 1209.933 1210.983 1214.567 1216.067 1216.633 1216.917 1219.133 1221.350 1221.517 1225.350 
       G        F        A        C        A        F        B        A        F        F        G        F        G        F 
1225.533 1225.967 1227.617 1228.917 1230.317 1233.533 1235.800 1237.517 1239.417 1241.600 1247.083 1247.450 1252.700 1253.267 

mydata我的建议是使用
findInterval
(基于以下问题的答案):

就示例的速度而言,有一些改进:

> microbenchmark( jalapic = {out<-list(); for(i in 1:length(ints)){out[[i]] <- names(mydata[mydata>=ints[i] & mydata<ints[i]+N])}},
+   mts = {idx = findInterval(ints2-1e-10, mydata2); out<-list(); for(i in 1:(length(ints)-1)){out[[i]] <- names(mydata2[(idx[i]+1):(idx[i+1])])}}, 
+   alexis = {split(names(mydata), findInterval(mydata, ints))},
+   R_Yoda = {dt[, groups := cut2(data,ints)]; result <- dt[, paste0(names, collapse=", "), by=groups]})
Unit: microseconds
    expr      min        lq       mean    median       uq      max neval
 jalapic   67.177   76.9725   85.73347   82.8035   95.866  119.890   100
     mts   43.851   52.7150   62.72116   58.3130   73.007   96.099   100
  alexis   75.573   86.5360   95.72593   91.4340  100.531  234.649   100
  R_Yoda 2032.066 2158.4870 2303.68887 2191.3750 2281.409 8719.314   100

>microbenchmark(jalapic={out出于性能原因,我使用data.table:

编辑:此解决方案有效,但速度不是很快(mts的答案证明了这一点)


我在加速类似问题方面积累了丰富的经验,比如使用
findInterval
。或者使用
cut
hmisc::cut2
来了解所需的性能:多少是“非常大的样本”以及多久应用一次“时间仓位”分组逻辑(“排列的1000秒时间”)使用
findInterval
你还可以进行
split(名称(mydata),findInterval(mydata,ints))
@alexis_laz做得很好!!!我刚刚对cut2和findInterval进行了基准测试(非常有趣!):
微基准(findInterval={findInterval(mydata,ints)},cut2={cut2(mydata,ints)})单位:微秒expr min lq mean uq max neval cld findInterval中值2.307 3.434 4.963 4.8250 5.8595 26.001 100 a cut2 590.122 623.445 709.359 714.8175 755.1235 1292.948 100 b
明确的赢家是:findInterval!!!@mts my prev.评论当然是给你的:-)@alexis_laz您的建议在语法方面非常好,如果您愿意发布我的+1作为答案sure@alexis_laz我完全同意你作为最佳解决方案的出色建议(你无法在简单向量上击败向量化操作的性能;-)对不起,结果只是一个字符串(需要将其转置而不是粘贴…)谢谢-这看起来很有希望。对于间隔结束,箱子不应重叠。因此,任何发生在分界线上的事件都应进入前一个箱子,而不是后一个箱子。因此箱子的长度为4.9999999秒,而不是5秒
mydata2 = c(-Inf, mydata)
ints <- seq(mydata[1], mydata[length(mydata)]+5, N)
idx = findInterval(ints-1e-10, mydata2)

out<-list()
for(i in 1:(length(ints)-1)){
  out[[i]] <- names(mydata2[(idx[i]+1):(idx[i+1])])
}
> out
[[1]]
[1] "B" "A" "B"

[[2]]
[1] "E" "A" "A" "B"

[[3]]
[1] "G" "G" "C"

[[4]]
[1] "A" "D" "E" "B"

[[5]]
[1] "B" "E"

[[6]]
[1] "E" "G" "F" "A" "C"

[[7]]
[1] "A" "F"

[[8]]
[1] "B" "A" "F"

[[9]]
[1] "F"

[[10]]
[1] "G" "F"

[[11]]
[1] "G" "F"
> microbenchmark( jalapic = {out<-list(); for(i in 1:length(ints)){out[[i]] <- names(mydata[mydata>=ints[i] & mydata<ints[i]+N])}},
+   mts = {idx = findInterval(ints2-1e-10, mydata2); out<-list(); for(i in 1:(length(ints)-1)){out[[i]] <- names(mydata2[(idx[i]+1):(idx[i+1])])}}, 
+   alexis = {split(names(mydata), findInterval(mydata, ints))},
+   R_Yoda = {dt[, groups := cut2(data,ints)]; result <- dt[, paste0(names, collapse=", "), by=groups]})
Unit: microseconds
    expr      min        lq       mean    median       uq      max neval
 jalapic   67.177   76.9725   85.73347   82.8035   95.866  119.890   100
     mts   43.851   52.7150   62.72116   58.3130   73.007   96.099   100
  alexis   75.573   86.5360   95.72593   91.4340  100.531  234.649   100
  R_Yoda 2032.066 2158.4870 2303.68887 2191.3750 2281.409 8719.314   100
set.seed(123)
mydata = sort(runif(n = 2000, min = 0, max = 100))
names(mydata) = sample(LETTERS[1:7], size = 2000, replace = T)
mydata2 = c(-Inf, mydata)
ints2 <- seq(mydata[1], mydata[length(mydata)]+5, N)
dt <- data.table(data=mydata, names=names(mydata) )
> microbenchmark( jalapic = {out<-list(); for(i in 1:length(ints)){out[[i]] <- names(mydata[mydata>=ints[i] & mydata<ints[i]+N])}},
+                 mts = {idx = findInterval(ints2-1e-10, mydata2); out<-list(); for(i in 1:(length(ints)-1)){out[[i]] <- names(mydata2[(idx[i]+1):(idx[i+1])])}}, 
+                 alexis = {split(names(mydata), findInterval(mydata, ints))},
+                 R_Yoda = {dt[, groups := cut2(data,ints)]; result <- dt[, paste0(names, collapse=", "), by=groups]})
Unit: microseconds
    expr      min        lq      mean    median        uq       max neval
 jalapic  804.243  846.9275  993.9957  862.0890  883.3140  7140.218   100
     mts   77.439   88.8685  100.6148  100.0640  106.5955   188.466   100
  alexis  187.066  204.7930  220.1689  215.5225  225.3190   299.026   100
  R_Yoda 3831.348 4066.4640 4366.5382 4140.1700 4248.8635 11829.923   100
library(Hmisc)
library(data.table)

# assuming that your mydata vector from the question is loaded
N=5   # code from your question...
ints <- seq(mydata[1], mydata[length(mydata)], N)   # code from your question...

dt <- data.table(data=mydata, names=names(mydata) )
dt[, groups := cut2(data,ints)]  # attention: shall the interval ends be included in the group or not?
groups <- dt[ , .(result=list(names)), by=groups]    # the elements of a data.table can be a list itself!
# to get the result as list:
out <- groups[,result]
out
out <- dt[, .(result=list(names)), by = findInterval(data,ints) ]
[[1]]
[1] "B" "A" "B"

[[2]]
[1] "E" "A" "A" "B"

[[3]]
[1] "G" "G" "C"

[[4]]
[1] "A" "D" "E" "B"

[[5]]
[1] "B" "E"

[[6]]
[1] "E" "G" "F" "A" "C"

[[7]]
[1] "A" "F"

[[8]]
[1] "B" "A" "F"

[[9]]
[1] "F"

[[10]]
[1] "G" "F"

[[11]]
[1] "G" "F"