根据函数计算序列中的特定行

时间:2015-05-07 07:45:05

标签: r filter dplyr reshape

让我们说我有一个由排序的行组成的数据框,如下所示:

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_sets中,计算有多少mag列显示&gt; 0或&lt; 0值。注意:一个值足以指示data_set已切换

3)总结所有状态内的切换状态,如

ss(switched state)/total(all data_sets)

4)对于满足范围90:54000的数据集,检查mag以查看数字&lt; 0的第一次观察以及相应的时间。注意:在每个数据集(交换状态数据集)中,只有一个时间值和一个mag值。

输出应该是这样的

1)data_sets

  

12

2)data_set [mag]&lt; 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

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

1 个答案:

答案 0 :(得分:1)

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)

One plot for each dataset showing which are included or not