в R- для всех значений, которые ИСТИНА, та же строка, предыдущий столбец также ИСТИНА? - PullRequest
1 голос
/ 02 ноября 2019

РЕДАКТИРОВАНИЕ:

В R. Я пытаюсь сгенерировать фрейм данных, полный логики, которая сообщает мне для всех значений ИСТИНА, является ли та же строка в предыдущем столбце ИСТИННОЙ. Столбцы представляют моменты времени, и я хочу знать для любой строки, которая соответствует действительности, является ли первый экземпляр этой строки истинным? Обратите внимание: мне нужно, чтобы он смотрел только на один момент времени (столбец). Если это было три колонки назад, но не в последнем, это все еще считается новым экземпляром.

пример фрейма данных:

T1<- c(TRUE, TRUE, FALSE)
T2<- c(FALSE, TRUE, FALSE) 
T3<- c(TRUE, FALSE, TRUE)
df<- data.frame(cbind(T1,T2,T3)) 
df

выглядит так:

     T1    T2    T3
1  TRUE FALSE  TRUE
2  TRUE  TRUE FALSE
3 FALSE FALSE  TRUE

, так как я спрашиваю о предыдущем столбце, нужно добавить нулевой столбец в начале

df_w_null<-cbind("null_col"= logical(nrow(df)), df)
df_w_null

выглядит так:

  null_col    T1    T2    T3
1    FALSE  TRUE FALSE  TRUE
2    FALSE  TRUE  TRUE FALSE
3    FALSE FALSE FALSE  TRUE

для каждой строки, где TRUE,это первый случай ИСТИНА? (является ли предыдущий столбец истинным? Если да, это не новый экземпляр, выведите false)

for (i in 2:ncol(df_w_null)){
  status[i]<- as.data.frame(apply((!df_w_null[,i, drop=FALSE] == df_w_null[,i-1, drop=FALSE]), 1, isTRUE))
  status<- data.frame(status)
  return(status)
}

выглядит так:

status[,2:ncol(df_w_null)]


1                 TRUE                  TRUE                TRUE
2                 TRUE                 FALSE                TRUE
3                FALSE                 FALSE                TRUE
#expected result:
1                 TRUE                 FALSE                TRUE
2                 TRUE                 FALSE                FALSE
3                FALSE                 FALSE                TRUE

Ответы [ 2 ]

2 голосов
/ 04 ноября 2019

Здесь происходит много маленьких шагов. Сначала data.frame разделяется на пары столбцов, затем эти пары столбцов проверяются на соответствие требованиям FALSE, а затем TRUE, а затем полученные логические векторы снова собираются в окончательный data.frame. .

as.data.frame(do.call(cbind, lapply(setNames(lapply(2:ncol(df_w_null), function(x) data.frame(df_w_null[x-1], df_w_null[x])), names(df_w_null)[-1]), 
       function(x) ifelse(x[,1] == F & x[,2] == T, T, F))))
     T1    T2    T3
1  TRUE FALSE  TRUE
2  TRUE FALSE FALSE
3 FALSE FALSE  TRUE
1 голос
/ 02 ноября 2019

Вот фрейм данных со всеми значениями в первом столбце FALSE

df1 <- cbind(FALSE, df)

Вы хотели бы иметь значение ИСТИНА, если столбец i не ИСТИНА (нас не интересует последнийcolumn, поэтому !df1[, -ncol(df1)]) И столбец i + 1 равен TRUE (нас не интересует первый столбец, поэтому df1[, -1]). У нас есть

> (!df1[, -ncol(df1)]) & (df1[, -1])
        T1    T2    T3
[1,]  TRUE FALSE  TRUE
[2,]  TRUE FALSE FALSE
[3,] FALSE FALSE  TRUE
...