Выбор чанков данных в зависимости от состояния

У меня есть вопрос о выборе фрагментов данных в зависимости от условия, которое я предоставляю. Это многоэтапный процесс, который, я думаю, должен выполняться в функции и может быть применен к другим наборам данных с помощью lapply.

  1. У меня есть data.frame, который имеет 19 столбцов (но в примере данных здесь только два). Я хочу сначала проверить строки первого столбца (времени), они должны быть в диапазоне 90 и 54000, если некоторые из них не в этом диапазоне пропустить их . После подсчета этих фрагментов подсчитайте, сколько столбцов mag показывают полные положительные и отрицательные/позитивные значения. Если фрагмент содержит отрицательное число, считайте его переключенным состоянием. и задайте скорость переключения примерно так (общее количество фрагментов, которые показывают состояние переключения)/(общее количество фрагментов, которые находятся между 90:54000)

  2. для фрагментов данных, которые удовлетворяют диапазону 90:54000, проверьте магнит для первого наблюдения числа <0 вместе с соответствующим временем


numbers <- c(seq(1,-1,length.out = 601),seq(1,0.98,length.out = 601))
time <- c(seq(90,54144,length.out = 601),seq(90,49850,length.out = 601))
data = data.frame(rep(time,times=12), mag=rep(numbers, times=6))
n <- 90:54000
dfchunk<- split(data, factor(sort(rank(row.names(data))%%n)))
ext_fsw<-lapply(dfchunk,function(x)x[which(x$Mag<0)[1],])
x.n <- data.frame(matrix(unlist(ext_fsw),nrow=n, byrow=T)

Вот как выглядит реальный набор данных:

V1 V2 V3 V4     V5      V6     V7      V8      V9    V10     V11     V12    V13    V14     V15    V16
1  90  0  0  0 0.0023 -0.0064 0.9987  0.0810  0.0375 0.9814  0.0829  0.0379 0.9803 0.0715  0.0270 0.9823
2 180  0  0  0 0.0023 -0.0064 0.9987  0.0887 -0.0281 0.9818  0.0956 -0.0288 0.9778 0.0796 -0.0469 0.9772
3 270  0  0  0 0.0023 -0.0064 0.9987 -0.0132 -0.0265 0.9776  0.0087 -0.0369 0.9797 0.0311 -0.0004 0.9827
4 360  0  0  0 0.0023 -0.0064 0.9987  0.0843  0.0369 0.9752  0.0765  0.0362 0.9749 0.0632  0.0486 0.9735
5 450  0  0  0 0.0023 -0.0064 0.9987  0.1075 -0.0660 0.9737  0.0914 -0.0748 0.9698 0.0586 -0.0361 0.9794
6 540  0  0  0 0.0023 -0.0064 0.9987  0.0006  0.0072 0.9808 -0.0162 -0.0152 0.9797 0.0369  0.0118 0.9763

Вот ожидаемые результаты (просто и пример)

Для части 1:

ss (swiched state)   total countable chunks   switching probability
 5                           10                         5/10

Для части 2:

time     mag
27207    -0.03
26520    -0.98
32034    -0.67
.
.
.
.
etc 

person Alexander    schedule 01.05.2015    source источник
comment
Что именно вы называете куском?   -  person goodtimeslim    schedule 02.05.2015
comment
Блоки данных @goodtimeslim означают количество блоков между 90:54000 внутри примерно длины nrows(data.frame)   -  person Alexander    schedule 02.05.2015
comment
Я до сих пор не понимаю, что такое кусок. Если переменная time находилась в диапазоне от 90 до 54000 для всех строк, означает ли это, что набор данных представляет собой один фрагмент? Является ли чанк одной строкой? Является ли чанк группой, в которой все они имеют одинаковое значение time?   -  person goodtimeslim    schedule 02.05.2015
comment
Если временная переменная была между 90 и 54000 для каждого случая, удовлетворяющего общему количеству nrows (data.frame), это означает, что набор данных имеет, скажем, 5 или 6 случаев, таких как этот, каждый из наборов данных представляет собой фрагмент. Я назвал чанк, потому что есть еще один вопрос, также используйте это слово   -  person Alexander    schedule 02.05.2015
comment
Другими словами, как последнее предложение, которое вы использовали.   -  person Alexander    schedule 02.05.2015
comment
Не могли бы вы показать несколько строк того, как выглядит ваш фрейм данных, и пример того, как вы хотите, чтобы этот процесс закончился?   -  person goodtimeslim    schedule 02.05.2015
comment
@goodtimeslim Я изменил вопрос.   -  person Alexander    schedule 02.05.2015


Ответы (1)


Ладно, думаю, разобрались. Я поместил их в две функции. Для каждой функции вы указываете кадр данных и имя столбца, и она возвращает запрошенные данные.

library(dplyr)
thabescity <- function(data, col){
  filter_vec <- data[col] < 0
  new_df <- data %>%
    filter(filter_vec) %>%
    filter(90 <= time & time <= 54000) %>%
    group_by(time) %>%
    summarise()

  ss <- nrow(new_df)
  total <- length(unique(data$time))
  switching_probability <- ss/total
  results <- c(ss, total, switching_probability)
  output <- as.data.frame(cbind(ss, total, switching_probability))
  return(output)
}

print(thabescity(data, "mag"))
   ss total switching_probability
1 298  1201             0.2481266

Вы можете составить список и запустить его в цикле, чтобы сделать все столбцы и получить его в виде списка:

data_names <- names(data)[2:length(names(data))]
first_problem <- list()
for(name in data_names){
  first_problem[[name]] <- thabescity(data, name)
}
first_problem[["mag"]]

   ss total switching_probability
1 298  1201             0.2481266

Вторая проблема немного проще:

thabescity2 <- function(data, col){
  data <- data[,c("time", col)]
  filter_vec <- data[col] < 0
  new_df <- data %>%
    filter(filter_vec) %>%
    filter(90 <= time & time <= 54000) %>%
    group_by(time) %>%
    filter(row_number() == 1)

  return(new_df)
}
print(thabescity2(data, "mag"))

Source: local data frame [298 x 2]
Groups: time

       time          mag
1  27207.09 -0.003333333
2  27297.18 -0.006666667
3  27387.27 -0.010000000
4  27477.36 -0.013333333
5  27567.45 -0.016666667
6  27657.54 -0.020000000
7  27747.63 -0.023333333
8  27837.72 -0.026666667
9  27927.81 -0.030000000
10 28017.90 -0.033333333
..      ...          ...

Вы можете сделать то же самое, что и выше, чтобы просмотреть весь фрейм данных:

data_names <- names(data)[2:length(names(data))]
second_problem <- list()
for(name in data_names){
  second_problem[[name]] <- thabescity2(data, name)
}
second_problem[["mag"]]

Source: local data frame [298 x 2]
Groups: time

       time          mag
1  27207.09 -0.003333333
2  27297.18 -0.006666667
3  27387.27 -0.010000000
4  27477.36 -0.013333333
5  27567.45 -0.016666667
6  27657.54 -0.020000000
7  27747.63 -0.023333333
8  27837.72 -0.026666667
9  27927.81 -0.030000000
10 28017.90 -0.033333333
..      ...          ...

Дважды проверьте мои результаты, но я думаю, что это делает то, что вы хотите.

person goodtimeslim    schedule 02.05.2015
comment
Большое спасибо за ответ; с другой стороны, в случае первой части выходные данные должны выглядеть как ss total switching_probability 1 12 24 0.5, потому что внутри данных, как вы можете видеть, есть 12 состояний ss (в которых значение mag показывает ‹ 0), потому что куски (наборы данных удовлетворяют 90:54000) всего 24. В своем ответе вы посчитали только один фрагмент, а в одном фрагменте, конечно, 1201 состояние, и 298 из них являются отрицательными числами. - person Alexander; 03.05.2015
comment
То, что я спросил, было внутри общего количества строк, сколько из них первое: удовлетворяет 90: 54000 и подсчитывает их. во-вторых: найдите значения mag, которые показывают только отрицательное число. В каждом фрагменте допустимо только одно наблюдение. поэтому в моем примере данных есть только 6 раз наблюдение отрицательных чисел магнита, а не общее количество отрицательных чисел внутри одного фрагмента. - person Alexander; 03.05.2015
comment
Что я имею в виду под чанком, можно понять здесь .com/questions/3302356/how-to-split-a-data-frame - person Alexander; 03.05.2015
comment
Я не совсем понимаю, о чем ты спрашиваешь. Что означает внутри общих строк? Что такое чанк? Я думал, вы сказали, что это группа строк, которые используют одну и ту же временную переменную. Является ли чанк столбцом? Я вижу, что в вашем примере есть шесть столбцов, содержащих отрицательное число. Также каждая строка содержит отрицательное число. Является ли строка куском? В вашем примере нет переменной времени, имеет ли значение время, кроме того, чтобы убедиться, что оно находится в указанном вами диапазоне? - person goodtimeslim; 03.05.2015
comment
Ok. кусок разбивает данные на более мелкие части в зависимости от некоторого условия. В моем случае условие определяется как время между 90 и 54000. В моих реальных данных этот столбец не важен. столбец, который меня волнует, - это V10, который иногда содержит номера neg/pos или все номера pos. Я пытаюсь выяснить, извлекая общие фрагменты (когда время между 90: 54000 удовлетворяется от первой строки данных до конца общей строки), скажем, общее количество строк равно 12, поэтому один фрагмент соответствует 1/12 от общего числа. куски - person Alexander; 03.05.2015
comment
В моем примере есть переменная времени time <- c(seq(90,54144,length.out = 601),seq(90,49850,length.out = 601)) data = data.frame(rep(time,times=12), mag=rep(numbers, times=6)), поэтому переменная времени между 90,54144 повторяется 12 раз (12 фрагментов), но Мэг показывает состояние переключения (sw)! в котором существуют отрицательные и положительные числа! в 6 раз, поэтому Switch_Probability составляет 0,5 - person Alexander; 03.05.2015
comment
Я пытаюсь извлечь первое наблюдение значения Mag внутри одного фрагмента. Just one time value and one Mag value time mag 1 27207.09 -0.003333333 2 27207.09 -0.003333333 3 27207.09 -0.003333333 4 27207.09 -0.003333333 5 27207.09 -0.003333333 6 27207.09 -0.003333333 here all numbers are identical due to limit of the example but in real data it это разное время и разное значение магнита для каждого случая. – - person Alexander; 07.05.2015