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