искать любую истину в столбце из списка фреймов данных в R - PullRequest
2 голосов
/ 12 октября 2019

У меня есть список фреймов данных, содержащих только логические (TRUE / FALSE) столбцы.

Мне нужно знать, содержит ли какой-либо из этих столбцов какое-либо значение TRUE (ожидается, что все они будут ложными, и фактически всеЛОЖЬ), но я получаю просто глупость.

mylist <-
  list(df1=data.frame(
    "column11" = c(FALSE, FALSE, FALSE, FALSE),
    "column12" = c(FALSE, FALSE, FALSE, FALSE)
  ),df2=data.frame(
    "column21" = c(FALSE, FALSE, FALSE, FALSE),
    "column22" = c(FALSE, FALSE, FALSE, FALSE)
  ),df3=data.frame(
    "column31" = c(FALSE, FALSE, FALSE, FALSE),
    "column32" = c(FALSE, FALSE, FALSE, TRUE)
      ))

lapply(mylist, function(x) any(TRUE))


$df1
[1] TRUE

$df2
[1] TRUE

$df3
[1] TRUE

Ответы [ 4 ]

3 голосов
/ 12 октября 2019

Одна из причин, по которой анонимная функция не работает должным образом, заключается в том, что ее аргумент не используется, вместо этого any() проверяет, является ли значение TRUE TRUE. Также необходимо передать логический вектор, а не data.frame.

Если вы хотите проверить, имеет ли какой-либо столбец в data.frame значение TRUE, используйте:

sapply(mylist, function(x) any(unlist(x)))

  df1   df2   df3 
FALSE FALSE  TRUE 

Если вы хотите проверить, имеет ли какой-либо конкретный столбец значение TRUE, используйте:

sapply(mylist, sapply, any)

           df1   df2   df3
column11 FALSE FALSE FALSE
column12 FALSE FALSE  TRUE
1 голос
/ 12 октября 2019

Неуловимый rapply вариант:

rapply(mylist, f = any, how = 'unlist')

df1.column11 df1.column12 df2.column21 df2.column22 df3.column31 df3.column32 
       FALSE        FALSE        FALSE        FALSE        FALSE         TRUE 

do.call(rbind, rapply(mylist, f = any, how = 'list'))

    column11 column12
df1 FALSE    FALSE   
df2 FALSE    FALSE   
df3 FALSE    TRUE  

И с принуждением:

sapply(rapply(mylist, f = any, how = 'list'), any)

  df1   df2   df3 
FALSE FALSE  TRUE 
0 голосов
/ 12 октября 2019

Согласно ?any

При заданном наборе логических векторов верно ли хотя бы одно из значений?

A matrix равно vector с dim атрибутами, а data.frame - нет. Один из вариантов - преобразовать в matrix и использовать any

lapply(mylist, function(x) any(as.matrix(x)))
0 голосов
/ 12 октября 2019

Мы используем lapply() для каждого dataframe в mylist, затем мы используем apply для каждого столбца dataframes.

abc = function(x) {
  tf = apply(x, 2, FUN = any)
}

lapply(mylist, FUN =  abc )

Вывод:

$df1
column11 column12 
   FALSE    FALSE 

$df2
column21 column22 
   FALSE    FALSE 

$df3
column31 column32 
   FALSE     TRUE 
...