首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只删除R中数据帧中的相邻重复项

只删除R中数据帧中的相邻重复项
EN

Stack Overflow用户
提问于 2014-11-19 16:34:14
回答 3查看 2.5K关注 0票数 7

我在R中有一个数据帧,,应该有重复的。然而,有一些重复,我将需要删除。特别是,我只想删除行-相邻的重复,但保留其余的。例如,假设我有数据框架:

代码语言:javascript
复制
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))

这将导致以下数据框架

代码语言:javascript
复制
x   y
A   1
B   2
C   3
A   4
B   5
C   6
A   7
B   8
B   9
C   10

在这种情况下,我希望有重复"A,B,C,A,B,C等“。但是,只有当我看到相邻的行重复时,才会出现问题。在上面的示例中,这将是第8行和第9行,重复的"B“彼此相邻。

在我的数据集中,每当发生这种情况时,第一个实例总是一个用户错误,第二个实例总是正确的版本。在非常罕见的情况下,可能存在重复发生3次(或更多)的情况。然而,在每一种情况下,我总是希望保持最后一次发生。因此,按照上面的示例,我希望最终数据集如下所示

代码语言:javascript
复制
A   1
B   2
C   3
A   4
B   5
C   6
A   7
B   9
C   10

在R中有一种简单的方法吗?提前感谢您的帮助!

编辑: 11/19/2014 12:14美国东部时间下午12:14用户阿克伦发布了一个解决方案(拼写?)后来就被删除了。我现在确定为什么,因为它似乎对我有用吗?

解决办法是

代码语言:javascript
复制
df = df[with(df, c(x[-1]!= x[-nrow(df)], TRUE)),]

它似乎对我有效,为什么它被删除?例如,在连续重复2次以上的情况下:

代码语言:javascript
复制
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

这看起来管用吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-19 16:57:45

试一试

代码语言:javascript
复制
 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

解释

这里,我们将一个元素与它前面的元素进行比较。这可以通过从列和该列中删除first element来完成,与删除last element的列相比(这样长度就相等了)。

代码语言:javascript
复制
 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

在上面,当我们删除一个元素时,长度小于1nrow of df。为了补偿这一点,我们可以连接一个TRUE,然后使用这个index来设置数据集。

票数 7
EN

Stack Overflow用户

发布于 2014-11-19 17:03:41

下面是一个rle解决方案:

代码语言:javascript
复制
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

解释:

RLE代表游程编码。它产生了一个向量列表。一个是运行值,另一个长度是每个值的连续重复次数。例如,x <- c(3, 2, 2, 3)有一个运行向量c(3, 2, 3)和lengths c(1, 2, 1)。在本例中,长度的累积和将产生c(1, 3, 4)。子集x与这个向量,你得到c(3, 2, 3)。请注意,长度向量的第二个元素是向量的第三个元素,在特定的“run”中最后出现的是2。

票数 5
EN

Stack Overflow用户

发布于 2014-11-19 17:20:23

你也可以试试

代码语言:javascript
复制
df[c(diff(as.numeric(df$x)), 1) != 0, ]

如果x属于character类(而不是factor),请尝试

代码语言:javascript
复制
df[c(diff(as.numeric(factor(df$x))), 1) != 0, ]
#    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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27022057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档