繁体   English   中英

R使用lapply操纵多个数据帧

[英]R manipulating multiple data frames using a lapply

我需要检查几个数据帧是否为空,如果它们为空则分配一个值。 我使用以下代码

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")
        })

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

就像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      

暂无
暂无

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

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