【问题标题】:Elegently reposition values within a dataframe优雅地重新定位数据框中的值
【发布时间】:2017-10-10 21:53:40
【问题描述】:

我正在处理 PDF 的文本层,并且需要进行一些小的更正...

我生成的整洁数据框有一个或两个数据值,它们相差一行。我有错误定位值的“坐标”(由其他变量的组合定义),并且我有它们实际应该去的位置。我只需要将数据值从 A 移动到 B 并过滤掉 A 对应的行。例如:

改变这个:

data.frame(A = 1:3,
           B = 1:3,
           C = c("Oops wrong row", NA, "this one is OK"))

进入这个:

data.frame(A = 2:3,
           B = 2:3,
           C = c("Oops wrong row", "this one is OK"))

我已经编写了一些代码来实现这一点。但它似乎比它需要的要冗长得多。在这个例子中,这些函数似乎依赖于数据框的附带特征。我认为这可能是一项常见任务——这种任务有标准模式吗?或者至少是更优雅的方法?

df <- data.frame(A = 1:3,
                 B = 1:3,
                 C = c("Oops wrong row", NA, "this one is OK"))

get_row <- function(df, A, B, output = "index") {

  index <- which(df[["A"]] == A & df[["B"]] == B)

  if (output == "index") {
    return(index)
  }
  else if (output == "C") {
    return(df[["C"]][[index]])
  }

}

correct_df <- function(df) {

  from <- list(A = 1,
               B = 1)

  to <- list(A = 2,
             B = 2)

  df <- df %>%
    dplyr::mutate(C = replace(C,
                                 get_row(., to[["A"]], to[["B"]]),
                                 get_row(., from[["A"]], from[["B"]],
                                          output = "C"))) %>%
    dplyr::filter(A != from[["A"]] | B != from[["B"]])

  return(df)

}

【问题讨论】:

    标签: r dataframe web-scraping dplyr data-munging


    【解决方案1】:

    我怀疑你的真实案例可能比你的例子复杂一些,但这是我通常使用dplyr::case_when() 完成的任务。

    基本上,如果您有定义哪些行需要更改的条件,您可以将它们用作case_when() 调用中的逻辑条件。请注意,我创建了一个新变量而不是替换现有变量 - 它使检查发生的事情变得更加容易。

    df <- data.frame(A = 1:3,
               B = 1:3,
               C = c("Oops wrong row", NA, "this one is OK"))
    df %>% 
      mutate(D = case_when(
        .$C == "Oops wrong row" & !is.na(.$C) ~ .$C[is.na(.$C)],
        is.na(.$C) ~ .$C[.$C == "Oops wrong row" & !is.na(.$C)],
        TRUE ~ .$C
      ))
    

    【讨论】:

      猜你喜欢
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      • 2016-10-09
      • 1970-01-01
      • 2020-03-16
      • 2013-08-24
      • 2022-11-18
      相关资源
      最近更新 更多