我有两个数据框,包含一系列案例.一个从时间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)
任何帮助,将不胜感激.
我真的很喜欢@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)