繁体   English   中英

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

[英]How to handle with empty dataframes in R?

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

例如,当我使用这样的应用时

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

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

这是为什么? 空数据帧是否有效? 为什么apply() MARGIN=1甚至在数据帧中没有行时尝试做任何事情? 我是否真的需要在每次应用之前添加条件以确保数据帧不为空?

谢谢!

这与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

在旁注: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是否为真:(代码取自约书亚)

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

我不认为它与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()来查看究竟是什么原因造成的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM