比较两个数据帧的列并获得R

时间:2018-04-05 02:47:26

标签: r dataframe

我有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(而不是go到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)。因此,对于所有用户,我需要计算偏差点以及实际的seq。  请查看DF1,DF2的附加图像以及所需的数据帧。

DF1

DF2

Required_dataframe

1 个答案:

答案 0 :(得分: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