【发布时间】:2019-08-21 13:08:12
【问题描述】:
我一直在使用名为 daff 的包比较 R 中的两个数据帧,这是我得到的最终表格:
dput(df)
structure(list(v1 = c("Silva->Silva/Mark", "Brandon->Brandon/Livo", "Mango->Mango or Apple"),
v2 = c("James->James=Jacy","NA->Na/Jane", "Egg->Egg and Orange")),
class = "data.frame", row.names = c(NA, -3L))
行字段具有 ->(箭头) 表示该单元格中的数据已从先前的数据帧列修改为当前数据帧值。现在从这里我不得不用 ->(arrow) 分隔符分隔列,这样我就可以拥有一个旧列和新的更改列。这意味着我在新列中添加了后缀_old 和 _New。我使用了这段代码并查看了输出:
setDT(df)
df1<- lapply(names(df), function(x) {
mDT <- df[, tstrsplit(get(x), " *-> *")]
if (ncol(mDT) == 2L) setnames(mDT, paste0(x, c("_Old", "_New")))
}) %>% as.data.table()
输出
dput(df)
structure(list(v1_Old = c("Silva", "Brandon", "Mango"),
v1_New = c("Silva/Mark", "Brandon/Livo", "Mango or Apple"),
v2_Old = c("James","NA", "Egg"),
v2_New = c("James=Jacy","Na/Jane", "Egg and Orange")),
class = "data.frame", row.names = c(NA, -3L))
现在我的下一步是比较具有 _old 和 _new 后缀的每两列,以确定修改的内容,然后拆分并存储在名为 diff_v1 的新列中 和 diff_v2。这是我使用这段代码完成的(意识到我必须通过创建不同的拆分代码行手动执行此操作,这对于 20 多个单独的列来说很乏味):
df$diff_v1<- mapply(function(x, y) paste(setdiff(y, x), collapse = '| '), strsplit(df$v1_old, '\\||, | | -| \\+'), strsplit(df$v1_Name_new, '\\||, | | -| \\+'))
df$diff_v2<- mapply(function(x, y) paste(setdiff(y, x), collapse = '| '), strsplit(df$v2_old, '\\||, | | -| \\+'), strsplit(df$v2_new, '\\||, | | -| \\+'))
输出
dput(df)
structure(list(v1_Old = c("Silva", "Brandon", "Mango"),
v1_New = c("Silva/Mark", "Brandon/Livo", "Mango or Apple"),
diff_v1 = c("/Mark", "/Livo", "or Apple"),
v2_Old = c("James","NA", "Egg"),
v2_New = c("James=Jacy","Na/Jane", "Egg and Orange"),
diff_v2 = c("=Jacy","/Jane", "and Orange")),
class = "data.frame", row.names = c(NA, -3L))
我的问题是我能否遍历具有 _old 和 _new 的列并创建名为 diff_v1 和 diff_v2 的新列 之后分别没有逐行运行代码。我有多个列,它们根据我正在比较的数据框不断变化。想知道如何使用代码自动识别具有 _Old 和 _New 后缀的列并拆分,然后在两者之后创建新列,但应该在每对列上发生。
目前我必须转到数据框,检查新旧列,然后手动更改正在拆分和创建 diff 列
的代码【问题讨论】: