2015-05-01 4 views
1

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

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

+0

Что именно вы называете куском? – goodtimeslim

+0

@goodtimeslim data chunks означает количество кусков между 90: 54000 внутри около длины нот (data.frame) – Alexander

+0

Я все еще смущен относительно того, какой кусок. Если переменная 'time' составляла от 90 до 54000 для всех строк, значит ли это, что набор данных - это один кусок? Является ли фрагмент одной строкой? Является ли фрагмент группой, в которой все они имеют одинаковое значение времени? – goodtimeslim

ответ

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 
..  ...   ... 

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

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 
..  ...   ... 

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

+0

Большое спасибо за ваш ответ; с другой стороны, в случае первой части выходные данные должны быть похожи на 'ss total switching_probability 1 12 24 0.5' потому что внутри данных, как вы можете видеть, есть состояние 12 ss (в котором магнит значение показывает <0), потому что куски (наборы данных удовлетворяют 90: 54000) составляют всего 24. В вашем ответе вы считали только один кусок, и в одном куске, конечно, 1201 состояние и 298 из них - отрицательное число. – Alexander

+0

То, что я спросил, было из общего количества строк, сколько из них сначала: удовлетворяет 90: 54000 и подсчитывает их. во-вторых: найдите значения mag, которые показывают только отрицательное число. В каждом куске только одно наблюдение в порядке. поэтому в моем примере данные есть только 6-кратное наблюдение отрицательных чисел, а не общее количество отрицательных чисел внутри одного куска. – Alexander

+0

Что я имею в виду с куском, здесь можно понять http://stackoverflow.com/questions/3302356/how-to-split-a-data-frame – Alexander