代码之家  ›  专栏  ›  技术社区  ›  Mus mzuba

如何检查某些列是否存在,如果不存在,如何创建它们并用零填充它们?

r
  •  1
  • Mus mzuba  · 技术社区  · 6 年前

    我有一个我操纵的数据框,它的最终形式有时会根据是否存在某些值而改变形状。

    一旦数据帧被处理并达到其最终形式,我希望在写入之前将列重新排序为特定的顺序。csv。

    然而,由于某些列并不总是存在,我想知道是否有可能检查哪些列存在,哪些列存在,哪些列存在,我希望它们遵循特定的格式,哪些列不需要创建并用零填充。

    我有一个解决方案,我认为它非常笨拙,可能会得到显著改进:在这个示例中,我检查列 taken_offline 存在于我的数据集中。如果是这样,我希望列以某种方式重新排序,并包括此列,如果不是这样,我希望 使\u脱机 创建并填充零,同时仍以相同方式重新排序。

    理想情况下,我希望能够说“这是列的显示顺序。如果列不存在,我希望创建它并用零填充它”。

    我知道一个好方法可能是从我的数据框中获取一个列名列表( users )然后根据所需的列顺序(如下所列)检查列名。然而,我不确定如何实现这个想法。

    我该怎么做?

    输出列应按以下顺序排列:

    "date",
    "storeName",
    "firstName",
    "lastName",
    "conversation-request",
    "conversation-accepted",
    "acceptance_rate",
    "conversation-missed",
    "taken_offline",
    "conversation-already-accepted",
    "total_missed",
    "conversation-declined"
    

    我的代码(检查是否存在 使\u脱机 ):

    if("taken_offline" %in% colnames(users_final)){
      users_final <- users_final[, c(
        "date",
        "storeName",
        "firstName",
        "lastName",
        "conversation-request",
        "conversation-accepted",
        "acceptance_rate",
        "conversation-missed",
        "taken_offline",
        "conversation-already-accepted",
        "total_missed",
        "conversation-declined"
      )]
      print("Taken offline occurrences.")
    } else {
      users_final$taken_offline <- 0
      users_final <- users_final[, c(
        "date",
        "storeName",
        "firstName",
        "lastName",
        "conversation-request",
        "conversation-accepted",
        "acceptance_rate",
        "conversation-missed",
        "taken_offline",
        "conversation-already-accepted",
        "total_missed",
        "conversation-declined"
      )]
      print("No taken offline occurrences.")
    }
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Gregor Thomas    6 年前

    其他答案的简单版本。多亏了R的向量循环,这可以通过两行快速完成。

    给列向量命名,比如 all_cols . 然后,调用您的数据 dd

    # add missing columns and set them equal to 0
    dd[setdiff(all_cols, names(dd)] = 0
    # put columns in desired order
    dd = dd[all_cols]
    

    工作示例:

    all_cols = c("date",
    "storeName",
    "firstName",
    "lastName",
    "conversation-request",
    "conversation-accepted",
    "acceptance_rate",
    "conversation-missed",
    "taken_offline",
    "conversation-already-accepted",
    "total_missed",
    "conversation-declined")
    
    dd = data.frame("date" = "yesterday",
    "storeName" = "Kwik-E-Mart",
    "firstName" = "Apu")
    
    dd[setdiff(all_cols, names(dd))] = 0
    dd = dd[all_cols]
    dd
    #        date   storeName firstName lastName conversation-request conversation-accepted acceptance_rate
    # 1 yesterday Kwik-E-Mart       Apu        0                    0                     0               0
    #   conversation-missed taken_offline conversation-already-accepted total_missed conversation-declined
    # 1                   0             0                             0            0                     0
    
        2
  •  1
  •   akash87    6 年前

    如果你有一个命名向量 varname 数据的名称和顺序 s 您希望可以使用:

    var_not_present <- varname[which(!(varname %in% names(s)))]
    h <- data.frame(matrix(0, ncol = length(var_not_present), nrow = dim(s)[1]))
    colnames(h) <- var_not_present
    s_updated <- cbind(s,h)
    s_updated <- s_updated[varname]