【问题标题】:Compare Two Columns For Matching Values And Align Side By Side比较两列的匹配值并并排对齐
【发布时间】:2019-09-11 03:36:44
【问题描述】:

我拥有的数据有两列的值应该匹配。由于行数太多,我必须执行以下操作:

  • 加载两列
  • 比较 A 和 B 以查找匹配值
  • 将列 A 和 B 的输出堆叠到两个新列中,这样匹配的值并排,不匹配的值位于每列的末尾。

是否有更快的方法来执行此操作,使其适用于任何类型的数据(整数、浮点数或字符)比较?

输入数据表

A   B
1   1
2   3
3   4
4   5
5   6
6   7
7   8
8   9
9   10
10  11

输出数据表

C   D
1   1
3   3
4   4
5   5
6   6
7   7
8   8
9   9
10  10
2   11

【问题讨论】:

  • 你能解释一下你的最终目标吗?我不理解请求的输出格式的目的,理解这可能有助于找到合适的解决方案。
  • @JonSpring - 有两列。我想为每一行值将这两列相互匹配,然后并排打印每列中匹配值的输出,而不是在末尾使用 NA 匹配值以使两列的行数相同.
  • 到目前为止你尝试过做什么?
  • @ethanpasta - 我尝试先从A 列循环遍历每一行并使用which(data$A == data$B),然后对B 列执行相同操作。但这在大数据上花费的时间太长了。

标签: r sorting dataframe datatable


【解决方案1】:

这是一种方法。我可能过于复杂了

#copy the object to another dataframe
df1 <- df
#Get matched indices for both the columns
inds1 <- match(df$A, df$B)
inds2 <- match(df$B, df$A)
#Replace value in B column in the same order as A
df1$B <- df$B[inds1]
#Order by column B
df1 <- df1[order(df1$B), ]
#Replace NA in B with unmatched value.
df1$B[is.na(df1$B)] <- df$B[is.na(inds2)]

df1
#    A  B
#1   1  1
#3   3  3
#4   4  4
#5   5  5
#6   6  6
#7   7  7
#8   8  8
#9   9  9
#10 10 10
#2   2 11

【讨论】:

  • .@RonakShah - 谢谢。 df2 是什么?
  • 对不起,我正在测试其他东西,它是剩下的。应该是df1。已更正。
  • .@RonakShah - 我用Excel 测试了你的代码输出并且它匹配。
  • 使用 fastmatch::fmatch 而不是 match 可能会加快处理大型数据集的速度。
【解决方案2】:

您可以在列A 和B 之间找到匹配的值,这将为您提供所需输出的上半部分。然后添加那些不匹配的。对于列A,这是从match 获得NA 的列B 的列,这是列号上没有序列索引的列:

x  <- data.frame(A=1:10, B=c(1,3:11)) #create your dataset

idx <- match(x$A, x$B)
idxNA  <- is.na(idx)
data.frame(C=c(x$A[!idxNA], x$A[idxNA]), D=c(x$B[idx[!idxNA]], x$B[!seq_along(x$B) %in% idx]))
#    C  D
#1   1  1
#2   3  3
#3   4  4
#4   5  5
#5   6  6
#6   7  7
#7   8  8
#8   9  9
#9  10 10
#10  2 11

如果您需要排序的输出,则必须对 A 和 B 进行排序(如果还没有的话)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 2023-03-26
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    相关资源
    最近更新 更多