我在于R的数据帧被认为具有重复.但是,我需要删除一些重复项.特别是,我只想删除与行相邻的重复项,但保留其余部分.例如,假设我有数据框:
df = data.frame(x = c("A", "B", "C", "A", "B", "C", "A", "B", "B", "C"),
y = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
Run Code Online (Sandbox Code Playgroud)
这导致以下数据帧
x y
A 1
B 2
C 3
A 4
B 5
C 6
A 7
B 8
B 9
C 10
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我希望重复"A,B,C,A,B,C等".但是,如果我看到相邻的行重复,这只是一个问题.在我上面的例子中,那将是行8和9,其中副本"B"彼此相邻.
在我的数据集中,每当发生这种情况时,第一个实例始终是用户错误,第二个实例始终是正确的版本.在极少数情况下,可能存在重复发生3次(或更多次)的实例.但是,在每种情况下,我总是希望保持最后一次出现.因此,按照上面的例子,我希望最终的数据集看起来像
A 1
B 2
C 3
A 4
B 5
C 6
A 7
B 9
C 10
Run Code Online (Sandbox Code Playgroud)
在R中有一个简单的方法吗?预先感谢您的帮助!
编辑次数:11/19/2014 12:14 PM EST 用户Akron(拼写?)发布的解决方案已被删除.我现在明白为什么,因为它似乎对我有用?
解决方案是
df = df[with(df, c(x[-1]!= x[-nrow(df)], TRUE)),]
Run Code Online (Sandbox Code Playgroud)
它似乎对我有用,为什么它被删除?例如,在连续重复次数超过2的情况下:
df = data.frame(x = c("A", "B", "B", "B", "C", "C", "C", "A", "B", "C", "A", "B", "B", "C"), y = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14))
x y
1 A 1
2 B 2
3 B 3
4 B 4
5 C 5
6 C 6
7 C 7
8 A 8
9 B 9
10 C 10
11 A 11
12 B 12
13 B 13
14 C 14
> df = df[with(df, c(x[-1]!= x[-nrow(df)], TRUE)),]
> df
x y
1 A 1
4 B 4
7 C 7
8 A 8
9 B 9
10 C 10
11 A 11
13 B 13
14 C 14
Run Code Online (Sandbox Code Playgroud)
这似乎有用吗?
尝试
df[with(df, c(x[-1]!= x[-nrow(df)], TRUE)),]
# x y
#1 A 1
#2 B 2
#3 C 3
#4 A 4
#5 B 5
#6 C 6
#7 A 7
#9 B 9
#10 C 10
Run Code Online (Sandbox Code Playgroud)
在这里,我们将一个元素与其前面的元素进行比较。这可以通过first element从列中删除 并将该列与从中删除的列进行比较来完成last element(以便长度变得相等)
df$x[-1] #first element removed
#[1] B C A B C A B B C
df$x[-nrow(df)]
#[1] A B C A B C A B B #last element `C` removed
df$x[-1]!=df$x[-nrow(df)]
#[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE
Run Code Online (Sandbox Code Playgroud)
在上面,长度1小于nrow,df因为我们删除了一个元素。为了弥补这一点,我们可以连接 aTRUE然后使用它index来设置数据集的子集。
这是一个 rle解决方案:
df[cumsum(rle(as.character(df$x))$lengths), ]
# x y
# 1 A 1
# 2 B 2
# 3 C 3
# 4 A 4
# 5 B 5
# 6 C 6
# 7 A 7
# 9 B 9
# 10 C 10
Run Code Online (Sandbox Code Playgroud)
解释:
RLE 代表行程编码。它产生一个向量列表。一个是运行、值,另一个长度是每个值的连续重复次数。例如,x <- c(3, 2, 2, 3)有一个运行向量c(3, 2, 3)和长度c(1, 2, 1)。在本例中,长度的累积总和产生c(1, 3, 4)。x用这个向量子集,你得到c(3, 2, 3). 请注意,长度向量的第二个元素是向量的第三个元素,也是该特定“运行”中最后一次出现的 2。