根据功能计算序列中的特定行

Counting specific rows in a sequence depending on function

假设我有一个数据框,其中包含许多按顺序排列的行,如下所示:

mag_numbers <- c(rep(seq(1,-1,length.out = 601),times=3), 
                 rep(seq(1,0.98,length.out = 601),times=2))
time <- c(rep(seq(90,54144,length.out = 601),times=2), 
          rep(seq(90,49850,length.out = 601),times=3))
data = data.frame(time=rep(time,times=6), mag=rep(mag_numbers, times=6))
data

  time       mag
1  90.00 1.0000000
2 180.09 0.9966667
3 270.18 0.9933333
4 360.27 0.9900000
5 450.36 0.9866667
6 540.45 0.9833333
*
*
*
*
18025 49435.33 0.9801667
18026 49518.27 0.9801333
18027 49601.20 0.9801000
18028 49684.13 0.9800667
18029 49767.07 0.9800333
18030 49850.00 0.9800000

在数据中,我想根据某些条件总结一些参数。这些条件是:

1) 计算那些在 90 到 54000 范围内的时间列行,如果其中一些不在这个范围内,则跳过它们。注意:假设一个 data_set 如果时间值在 90 和 54000 值之间。

2) 在所有 data_set 中,计算有多少 mag 列显示 >0 或 <0 值。注意:一个值就可以表示data_set被switched

3)像这样总结所有状态中的切换状态

ss(switched state)/total(all data_sets)

4)对于满足范围90:54000的数据集,检查第一个观测值<0的mag以及相应的时间。注意:在每个数据集(开关状态数据集)中只有一个时间值和一个幅度值。

输出应该是这样的

1) data_sets

12

2) data_set[mag] < 0

9

3) ss/total

9/12

4)

               time          mag
data_set1  27207.09 -0.003333333
data_set2  27297.18 -0.006666667
data_set3  27387.27 -0.010000000
data_set4  27477.36 -0.013333333

所以主要问题是如何在函数中执行这些操作?以及读取后目录中的所有数据。

library(dplyr)

地块

有助于查看数据集的含义:

plot(data$mag,type="l")
plot(data$time, type = "l")
lapply(list(seq(1,30)),function(i) text(-600+601*i,0,i))

给数据集一个数字

data$lag <- data$time - lag(data$time) <0
data$lag[is.na(data$lag)] <- 0
data$set <- cumsum(data$lag)

供参考

length(unique(data$set))
# 30

回复点 1)

找出排除和包含哪些数据集

excluded <- unique(filter(data, time > 50000)$set)
length(excluded)
# 12
included <- unique(filter(data, ! set %in% excluded)$set)
length(included)
# 18

回复点2)

如果我理解的很好,你正在寻找 包含正负 mag 值的集合 这些将有 abs(sum(mag) != sum(abs(mag))

 switched <- data %>% 
  group_by(set) %>%
  summarise(abs(sum(mag)),
            sum(abs(mag)),
            changedsign = abs(sum(mag))!=sum(abs(mag)))
length(unique(filter(switched, changedsign)$set))
# 18
length(unique(filter(switched, changedsign &
                      set %in% included)$set))
# 6

回复点3)

cat(length(unique(filter(switched, changedsign &
                      set %in% included)$set)), 
    "/",
    length(unique(filter(data, ! set %in% excluded)$set)))

第4点我不是很明白

每个数据集一个图

如果您安装了 ggplot2 包:

library(ggplot2)
ggplot(data, aes(x = time, y = mag, 
               color = set %in% included)) +
geom_line() + 
facet_wrap(~set)