如何删除R中的重复行

时间:2013-06-09 06:40:30

标签: r

我有以下数据

x y z

1 2 a

1 2

数据[2,3]是一个因素,但没有显示, 在数据中,它有很多这样的行。当z什么都没有时如何删除行? 我的意思是删除第二行等行。

输出应该是

x y z

1 2 a

2 个答案:

答案 0 :(得分:5)

行。在这里黑暗中刺了一下。

想象一下以下数据集:

mydf <- data.frame(
  x = c(.11, .11, .33, .33, .11, .11),
  y = c(.22, .22, .44, .44, .22, .44),
  z = c("a", "", "", "f", "b", ""))
mydf
#      x    y z
# 1 0.11 0.22 a
# 2 0.11 0.22  
# 3 0.33 0.44  
# 4 0.33 0.44 f
# 5 0.11 0.22 b
# 6 0.11 0.44  

从你的标题和描述的组合(两者似乎都没有完全描述你的问题),我会解码你要删除第2行和第3行,但不是第6行。换句话说,你想先检查行是否重复(可能只是前两列),然后,如果第三列为空,则删除该行。根据这些说明,第5行应保留(列“z”不为空白),第6行应保留(第1列和第2列的组合不重复)。

如果是这种情况,这里有一种方法:

# Copy the data.frame, "sorting" by column "z"
mydf2 <- mydf[rev(order(mydf$z)), ]
# Subset according to your conditions
mydf2 <- mydf2[duplicated(mydf2[1:2]) & mydf2$z %in% "", ]
mydf2
#      x    y z
# 3 0.33 0.44  
# 2 0.11 0.22  

^^这些是我们要删除的数据。删除它们的一种方法是在每个数据集的setdiff上使用rownames

mydf[setdiff(rownames(mydf), rownames(mydf2)), ]
#      x    y z
# 1 0.11 0.22 a
# 4 0.33 0.44 f
# 5 0.11 0.22 b
# 6 0.11 0.44  

答案 1 :(得分:0)

一些示例数据:

df = data.frame(x = runif(100), 
                y = runif(100),
                z = sample(c(letters[0:10], ""), 100, replace = TRUE))

> head(df)
          x          y z
1 0.7664915 0.86087017 a
2 0.8567483 0.83715022 d
3 0.2819078 0.85004742 f
4 0.8241173 0.43078311 h
5 0.6433988 0.46291916 e
6 0.4103120 0.07511076  

显示缺少值的第六行。您可以使用logical的向量进行子集化(TRUE,FALSE):

df[df$z != "",]

正如@AnandaMahto评论的那样,您甚至可以根据多种情况进行检查:

df[!df$z %in% c("", " "),]