对于在时间1和时间2之间没有发生任何变化的情况,删除所有id的情况

Eri*_*ail 5 r data-management

我有两个数据框,包含一系列案例.一个从时间1和一个从时间2.我正在寻找一种方法来快速识别在时间1和时间2之间发生变化的情况,我有点卡住.

这是一个例子.所以,我从时间1开始有一个数据框,

df.t1 <- data.frame(id = c(1,1,1,2,2,3,3,5,5,6), ABC = LETTERS[1:10], Num = 101:110)
Run Code Online (Sandbox Code Playgroud)

它看起来像这样,

df.t1
   id ABC Num
1   1   A 101
2   1   B 102
3   1   C 103
4   2   D 104
5   2   E 105
6   3   F 106
7   3   G 107
8   5   H 108
9   5   I 109
10  6   J 110
Run Code Online (Sandbox Code Playgroud)

时间两卷

df.t2 <- df.t1
Run Code Online (Sandbox Code Playgroud)

并发生一些变化,

df.t2[3,3] <- 104
df.t2[2,2] <- "H"
df.t2[8,3] <- 999
df.t2[10,3] <- NA
df.t2[11,] <- c(3, "J", 107)
Run Code Online (Sandbox Code Playgroud)

这是时间2,

df.t2
   id ABC  Num
1   1   A  101
2   1   H  102
3   1   C  104
4   2   D  104
5   2   E  105
6   3   F  106
7   3   G  107
8   5   H  999
9   5   I  109
10  6   J <NA>
11  3   J  107
Run Code Online (Sandbox Code Playgroud)

我现在正在寻找一种快速方法来删除案例,所有id,如果在时间1和时间2之间的情况下(任何行)没有发生任何变化的情况.在具体的例子中,只有id#2没有变化发生在时间1和时间2之间.

我正在寻找一个看起来像这样的最终结果,

(df <- subset(df.t2, id != 2))
   id ABC  Num
1   1   A  101
2   1   H  102
3   1   C  104
6   3   F  106
7   3   G  107
8   5   H  999
9   5   I  109
10  6   J <NA>
11  3   J  107
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.

Aar*_*ica 2

我真的很喜欢@alexwhan在这里的回答/sf/answers/1040615201/,但由于许多列和长字符串,听起来组合很慢。我想知道为每个组合获取唯一的数字是否会更快。

# get a matrix of unique integers for each column (stacking the two data frames)
ms <- do.call(cbind, lapply(seq_len(ncol(df.t1)), function(ni) {
  xi <- c(as.character(df.t1[[ni]]), as.character(df.t2[[ni]]))
  match(xi, unique(xi))
}))
# convert to base max(ms) to get a single unique identifying number
us <- as.vector(ms %*% max(ms)^c(0:(ncol(ms)-1)))
u2 <- us[(nrow(df.t1)+1):length(us)]
u1 <- us[1:nrow(df.t1)]
# now get changed values and proceed as in alexwhan's answer
ch <- unique(df.t2$id[! u2 %in% u1])
df.t2[df.t2$id %in% ch,]
Run Code Online (Sandbox Code Playgroud)

这是获取us变量的稍微不同的方法,我希望它会慢一点,但会更加小心地将所有内容保留为整数而不是浮点数字,因此应该保证唯一性,并且我相信任何浮点溢出都会导致警告。(我还从中减去了一个,ms因为它仍然是独一无二的,而且所有东西都小了一点。)

base <- as.integer(max(ms)^c(0:(nrow(ms)-1)))
us <- apply((ms-1L) * base, 2, sum)
Run Code Online (Sandbox Code Playgroud)