Повторные сравнения между текущей строкой и следующей строкой (в том же столбце) - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть такой фрейм данных (5 строк и 1 столбец),

       data
row1    5
row2    4
row3    12
row4    6
row5    7

Я хочу провести сравнение между текущими и последующими строками, как показано в этой таблице.

compare    YES  NO
row1<row2       0
row1<row3   1   
row1<row4   1   
row1<row5   1   
row2<row3   1   
row2<row4   1   
row2<row5   1   
row3<row4       0
row3<row5       0
row4<row5   1   

Другой, я набрал несколько кодов в R, с циклом for.

    for (i in 1:nrow(data)){
  if (data[i,] <data[(i+1):5,]){
    print("1")
  } else { 
    print ("0")
  } 
}

Однако я получаю информацию об ошибке. missing value where TRUE/FALSE needed

Может кто-нибудь помочь мне решитьЭта проблема?Или, может быть, функция применения лучше?

Извините за мой плохой английский, и большое спасибо за ваше драгоценное время!

1 Ответ

0 голосов
/ 28 февраля 2019

Мне не совсем ясно, какова ваша конечная цель;ваш ожидаемый результат выглядит как неуклюжий формат данных.Я предполагаю, что это должно соответствовать некоторой форме пользовательских / устаревших требований к форматированию данных.

Помимо этого, вы можете использовать outer для выполнения всех парных сравнений, а затем выполнить некоторую форму данных

library(tidyverse)
outer(df$data, df$data, FUN = function(x, y) x < y) %>%
    as.data.frame() %>%
    rowid_to_column("rowx") %>%
    gather(rowy, val, -rowx) %>%
    mutate(
        rowx = paste0("row", rowx),
        rowy = sub("V", "row", rowy)) %>%
    filter(rowx < rowy) %>%
    unite(compare, rowx, rowy, sep = "<") %>%
    transmute(
        compare,
        Yes = if_else(val == TRUE, 1, 0),
        No = if_else(val == FALSE, 1, 0))
    )
#     compare Yes No
#1  row1<row2   1  0
#2  row1<row3   1  0
#3  row2<row3   1  0
#4  row1<row4   1  0
#5  row2<row4   0  1
#6  row3<row4   0  1
#7  row1<row5   1  0
#8  row2<row5   1  0
#9  row3<row5   0  1
#10 row4<row5   1  0

Пример данных

df <- read.table(text =
    "data
1   0.05493405
2   0.07844055
3   0.12901255
4   0.0655028
5   0.078554925", header = T)
...