Как обращаться с пустыми фреймами данных в R? - PullRequest
4 голосов
/ 07 сентября 2010

Я заметил, что иногда я получаю ошибки в моих R-сценариях, когда забываю проверить, действительно ли кадр данных, над которым я работаю, пуст (содержит ноль строк).

Например, когда я использовал apply, вот так

apply(X=DF,MARGIN=1,FUN=function(row) !any(vec[ row[["start"]]:row[["end"]] ]))

и DF оказались пустыми, я получил ошибку о подписках.

Почему это так?Не верны ли пустые кадры данных?Почему apply() с MARGIN=1 даже пытается что-то сделать, когда в кадре данных нет строк?Действительно ли мне нужно добавлять условие перед каждым таким обращением, чтобы убедиться, что кадр данных не пустой?

Спасибо!

Ответы [ 4 ]

3 голосов
/ 07 сентября 2010

С другой стороны: применить всегда доступ к функции, которую вы используете, по крайней мере, один раз.Если входные данные представляют собой фрейм данных без каких-либо строк, но с определенными переменными, он отправляет «FALSE» в качестве аргумента функции.Если фрейм данных полностью пуст, он отправляет логическую (0) функции.

> x <- data.frame(a=numeric(0))
> str(x)
'data.frame':   0 obs. of  1 variable:
 $ a: num 

> y <- apply(x,MARGIN=1,FUN=function(x){print(x)})
[1] FALSE

> x <- data.frame()

> str(x)
'data.frame':   0 obs. of  0 variables

> y <- apply(x,MARGIN=1,FUN=function(x){print(x)})
logical(0)

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

РЕДАКТИРОВАТЬ: Это означает, что вы должны учитывать, что длина (x) == 0 не очень хорошая проверка, вам нужно проверить, является ли длина (x == 0) или! X ИСТИНА, если обаВозможности могут возникнуть: (Код взят из Джошуа)

apply(X=data.frame(),MARGIN=1,  # empty data.frame
  FUN=function(row) {
    if(length(row)==0 || !row) {return()}
    !any(vec[ row[["start"]]:row[["end"]] ])
  })
3 голосов
/ 07 сентября 2010

Это абсолютно не имеет отношения к apply. Применяемая вами функция не работает, когда data.frame пуст.

> myFUN <- function(row) !any(vec[ row[["start"]]:row[["end"]] ])
> myFUN(DF[1,])  # non-empty data.frame
[1] FALSE
> myFUN(data.frame()[1,])  # empty data.frame
Error in row[["start"]]:row[["end"]] : argument of length 0

Добавить условие к вашей функции.

> apply(X=data.frame(),MARGIN=1,  # empty data.frame
+  FUN=function(row) {
+    if(length(row)==0) return()
+    !any(vec[ row[["start"]]:row[["end"]] ])
+  })
NULL
1 голос
/ 07 сентября 2010

Я бы использовал mapply вместо:

kk <- data.frame( start = integer(0), end = integer(0) )
kkk <- data.frame( start = 1, end = 3 )

vect <- rnorm( 100 ) > 0

with(kk,  mapply( function(x, y) !any( vect[x]:vect[y] ), start, end ) )
with(kkk, mapply( function(x, y) !any( vect[x]:vect[y] ), start, end ) )
1 голос
/ 07 сентября 2010

Я не думаю, что это связано с 0-строкой data.frame:

X <- data.frame(a=numeric(0))
str(X)
# 'data.frame':   0 obs. of  1 variable:
# $ a: num 
apply(X,1,sum)
# integer(0)

Попробуйте использовать traceback() после ошибки, чтобы увидеть, что именно вызывает ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...