[英]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.