【问题标题】:comparing columns of two dataframes and get the deviation point in R比较两个数据帧的列并获得 R 中的偏差点
【发布时间】:2018-04-05 11:06:18
【问题描述】:

我有 2 个数据框:

> dput(DF1)
    structure(c("a", "b", "c", "d", "e", "f", "g"), .Dim = c(1L, 
    7L), .Dimnames = list("1", c("seq1", "seq2", "seq3", "seq4", 
    "seq5", "seq6", "seq7")))

> dput(DF2)
    structure(list(seq1 = c("a", "a", "a", "a", "a"), seq2 = c("b", 
    "d", "d", "d", "b"), seq3 = c("c", "c", "c", "c", "c"), seq4 = c("e", 
    "e", "d", "d", "d"), seq5 = c("f", "f", "f", "g", "e"), seq6 = c("g", 
    "g", "g", "g", "g"), seq7 = c("g", "g", "g", "g", "g"), UserId = c("1", 
    "2", "3", "4", "5")), .Names = c("seq1", "seq2", "seq3", "seq4", 
    "seq5", "seq6", "seq7", "UserId"), row.names = c(NA, -5L), class = "data.frame")

这些是我想要比较的上述两个数据集,例如 DF2 中的 User1 偏离了 e(而不是 goind 到 d,他去了 e)。 DF1 是我正确定义的序列。 所以最后我需要按照以下要求制作一个数据框:

> dput(required_dataframe)
structure(list(UserID = c("1", "2", "3", "4", "5"), Deviation = c("e", 
"d", "d", "d", "g"), Actual_sequence = c("d", "b", "b", "b", 
"f")), .Names = c("UserID", "Deviation", "Actual_sequence"), row.names = c(NA, 
-5L), class = "data.frame")

对于 user1 偏离点 e 的实例(它应该已经到 d)。因此,对于所有用户,我需要计算偏差点以及实际序列。 DF1 ,DF2 的附件图片以及所需的数据框请找到。

DF1

DF2

Required_dataframe

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    一旦您让两个矩阵完美对齐,您就可以逐行比较它们并找出它们不匹配的地方。然后,您可以在每一行中找到第一个值并将其用作选择:

    sel <- cbind(
      seq_len(nrow(DF2)),
      max.col(t(t(DF2[seq_along(DF1)]) != c(DF1)), "first")
    )
    cbind(DF2["UserId"], Deviation=DF2[sel], Actual=DF1[sel[,2]])
    
    #  UserId Deviation Actual
    #1      1         e      d
    #2      2         d      b
    #3      3         d      b
    #4      4         d      b
    #5      5         g      f
    

    比较的核心是这部分,在这里可以看到每个单元格被排成一行:

    t(DF2[seq_along(DF1)]) != c(DF1)
    
    #      [,1]  [,2]  [,3]  [,4]  [,5]
    #seq1 FALSE FALSE FALSE FALSE FALSE
    #seq2 FALSE  TRUE  TRUE  TRUE FALSE
    #seq3 FALSE FALSE FALSE FALSE FALSE
    #seq4  TRUE  TRUE FALSE FALSE FALSE
    #seq5  TRUE  TRUE  TRUE  TRUE FALSE
    #seq6  TRUE  TRUE  TRUE  TRUE  TRUE
    #seq7 FALSE FALSE FALSE FALSE FALSE
    

    【讨论】:

    • 嗨@thelatemail,当时它工作正常,但不知道我误触了什么,所以它提供了更多的列而不是实际的。你能指导一些事情吗......
    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 2019-10-07
    • 2017-04-26
    相关资源
    最近更新 更多