R使用lapply操纵多个数据帧

时间:2016-08-05 05:59:47

标签: r

我需要检查几个数据帧是否为空,如果它们为空则分配一个值。我为此

使用以下代码
a =  data.frame()
b =  data.frame()

x =  list(a, b)

cc =  lapply(x, function(x)
        if(is.data.frame(x) && nrow(x)==0){
          x= data.frame("11111")
        })

然而,这导致列表。我想知道是否有一种方法可以在不将数据帧放入列表的情况下进行此操作

1 个答案:

答案 0 :(得分:0)

就像akrun所说的那样,你应该有一个else-branch来返回x,以防它不为空,现在你的代码总是生成空的。否则,如果您的数据中始终有某些列,我还会准备一个合适的空数据框。这是通过使用符号来准备列的代码,例如数字(0),字符(0),整数(0)等。

emptyframe = data.frame(num = numeric(0), name = character(0))

a = emptyframe
b = data.frame(num = 1:2, name = paste("ID", 1:2))
c = data.frame(num = 6:8, name = paste("ID", 6:8))
d = emptyframe

x =  list(a, b, c, d)

combined =  lapply(x, function(x){
    if(is.data.frame(x) && nrow(x)==0){
        # Creating an empty data frame you'd preferably want to know before-hand what kind of variables you will have
        emptyframe
    }else{ # I would also cast it data.frame before returning, as it may have just failed cause of is.data.frame == FALSE
        as.data.frame(x)
    }
})

combined

#> combined
#[[1]]
#[1] num  name
#<0 rows> (or 0-length row.names)
#
#[[2]]
#  num name
#1   1 ID 1
#2   2 ID 2
#
#[[3]]
#  num name
#1   6 ID 6
#2   7 ID 7
#3   8 ID 8
#
#[[4]]
#[1] num  name
#<0 rows> (or 0-length row.names)   

如果您的空数据帧是一致的,那么您可以使用上述方法对data.frames进行大量简洁的操作,因为它们被认为是常规的。例如,考虑将它们行绑定到一个更大的data.frame:

do.call("rbind", combined)

#> do.call("rbind", combined)
#  num name
#1   1 ID 1
#2   2 ID 2
#3   6 ID 6
#4   7 ID 7
#5   8 ID 8