在数据框中重新定位值

时间:2017-10-10 21:53:40

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

我正在使用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)

}

1 个答案:

答案 0 :(得分:0)

我怀疑你的真实情况可能比你的例子复杂一点,但这是我通常用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
  ))