我注意到,当我忘记检查我正在处理的数据帧是否实际为空(零行)时,我的R脚本中会出现错误。
例如,当我使用像这样的
时 apply(X=DF,MARGIN=1,FUN=function(row) !any(vec[ row[["start"]]:row[["end"]] ]))
和DF
碰巧是空的,我收到了关于下标的错误。
为什么?空数据帧是否有效?为什么apply()
MARGIN=1
甚至会在数据框中没有行时尝试执行任何操作?我是否真的需要在每次申请之前添加条件以确保数据框不为空?
谢谢!
答案 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 ) )