【问题标题】:rbind () on a conditional basisrbind() 有条件的
【发布时间】:2017-11-18 01:24:51
【问题描述】:

问题来了。我有一堆 if 语句,它们根据用户输入创建不同的数据帧 (A-F)。在某些情况下,一些数据框会是空的,所以可能 (A-C) 是空的,但 (D-F) 有信息。

我正在尝试创建一个条件 rbind(),它仅在数据框不为空时才组合行。

我不太确定该怎么做?我不知道我是否应该创建一堆条件并使用另一个 if 语句:

cond_a <- nrow(a) != 0
cond_b <- nrow(b) != 0
cond_c <- nrow(c) != 0
cond_d <- nrow(d) != 0
cond_e <- nrow(e) != 0
cond_f <- nrow(f) != 0 

但是我不知道如何利用这些条件......

编辑:退后一步并更好地解释:我有一个数据帧,我通过按列子集将其拆分为 6 个不同的数据帧,因此它将其拆分为 6 个数据帧 (A-G)。该列有字母 A-G。该列中的这些字母 A-G 会根据用户输入而变化。

然后我有一系列 if 语句询问“如果 A 不为空,则执行此聚合”,因此如果 df 中没有数据,则跳过它。聚合将其从 16 列增加到 19 列。因为空的 df 没有被聚合,它仍然有 19 列。在我执行了这些 if 语句和聚合之后,我留下了 dfA、dfB、dfC 等,它们要么已经聚合(16 列),要么仍然为空(19 列)。然后我想要一段代码,上面写着“对于已聚合的 df(16 列)rbind,如果 df 尚未聚合(为空),则不要执行 rbind。

谢谢!

【问题讨论】:

  • rbind 适用于空的 data.frames。 rbind(data.frame(a = 1:10, b = 1:10), data.frame())
  • 问题是由于创建它们的另一个 if 语句,空数据框的列数不同,所以我正在寻找本质上说的东西,如果这个数据框是空的我要把它排除在 rbind 之外
  • 我很想看看你的空 data.frame 是什么样子的
  • 它只是一个有 19 列的 df,上面写着“表中没有可用的数据”,因为它是空的,不会聚合到非空的聚合到的 16 列,所以我只想合并已聚合的 df,但基于条件,因为取决于用户输入的空 df 更改的数量,如果这有意义吗?
  • “非空”不同于“结构不同”。 rbind 对参数中存在的列进行了一些假设(dplyr::bind_rows 允许更多一些)。但我认为您需要先解决将 data.frames 与不同字段组合的问题,然后才能意识到组合空的 data.frames(具有足够相似的结构)不需要调节。

标签: r if-statement conditional rbind


【解决方案1】:

你可以这样做:

  1. 创建一个您希望选择的数据框的空列表。
  2. 写一堆if 语句,看看哪些包含非零零
  3. 继续将那些非零 DF 的名称添加到步骤 1 中创建的空列表中
  4. 编写一个表达式,将这些名称折叠成rbind 表达式
  5. 计算表达式

这是执行此操作的脚本:

1.创建一个空列表来存储数据框的名称

list.df = " "

2&3。 if 语句检查数据框是否为非零,如果为真,则将名称添加到列表中

if(nrow(df.a) > 0) { 
  list.df=c(list.df,deparse(substitute(df.a)))
 }

if(nrow(df.b) > 0) { 
  list.df=c(list.df,deparse(substitute(df.b)))
 }

if(nrow(df.c) > 0) { 
 list.df=c(list.df,deparse(substitute(df.c)))
 }

.... 以此类推,从 A 到 G

if(nrow(df.g) > 0) { 
 list.df=c(list.df,deparse(substitute(df.g)))
 }

4.形成表达式

list.df = list.df[2:length(list.df)] #remove first element 
expression = paste0("df.combined = rbind(",paste0( list.df, collapse =
','), paste0(")"))

5.评估表达式

eval(parse(text=expression))

df.combined 将是您正在寻找的最终数据集

【讨论】:

    猜你喜欢
    • 2015-10-11
    • 2020-09-30
    • 2016-12-29
    • 2015-04-26
    • 2012-11-15
    • 1970-01-01
    • 2011-10-28
    • 2014-12-05
    • 2014-06-03
    相关资源
    最近更新 更多