如何处理R中的空数据帧?

时间:2010-09-07 07:39:01

标签: r dataframe

我注意到,当我忘记检查我正在处理的数据帧是否实际为空(零行)时,我的R脚本中会出现错误。

例如,当我使用像这样的

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

DF碰巧是空的,我收到了关于下标的错误。

为什么?空数据帧是否有效?为什么apply() MARGIN=1甚至会在数据框中没有行时尝试执行任何操作?我是否真的需要在每次申请之前添加条件以确保数据框不为空?

谢谢!

4 个答案:

答案 0 :(得分:3)

这与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 :(得分:3)

旁注:apply始终至少访问您使用的功能一次。如果输入是没有任何行但具有已定义变量的数据帧,则它将“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)

正如Joshua已经告诉过你的那样,要么在应用之前控制数据帧是否有行,要么在apply中的函数中添加条件。

编辑: 这意味着您应该考虑到长度(x)== 0不是一个非常好的检查,如果两种可能性都出现,您需要检查长度(x == 0)或!x是否为TRUE: (代码来自约书亚)

apply(X=data.frame(),MARGIN=1,  # empty data.frame
  FUN=function(row) {
    if(length(row)==0 || !row) {return()}
    !any(vec[ row[["start"]]:row[["end"]] ])
  })

答案 2 :(得分:1)

我不认为这与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(),看看究竟是什么导致它。

答案 3 :(得分:1)

我会改用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 ) )