我有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的附加图像以及所需的数据帧。
答案 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