R:搜索每一行,并删除每行中的重复值(每行可能不同)

时间:2016-07-18 21:34:25

标签: r data-manipulation

我有一个数据集(df),如下所示:

      val1                                val2               val3
1    ST  1.2  6.59 0.72 0       ST 1.2  6.59 0.72 0     PEACH 1.05  6.62 0.49 0
2   PEACH 1.05  6.62 0.49 0     ST 1.2  6.59 0.72 0     PEACH 1.05  6.62 0.49 0
3    ST  1.2  6.59 0.72 0       ST 1.2  6.59 0.72 0     PEACH 1.05  6.62 0.49 0

         val4                              val5
1 VANI 1.06 16.57 1.019 0    BB 1.0  6.75 0.45 0
2 VANI 1.06 16.57 1.019 0    BB 1.0  6.75 0.45 0
3 VANI 1.06 16.57 1.019 0    BB 1.0  6.75 0.45 0

每行包含五个字符串,其中两个将重复(每个重复列可能不同),我想删除每一行的重复列。

我尝试了unique(df[1,])duplicated(dt[1,]),但他们一直表示没有重复的值。

我使用df[1,1] == df[1,2]进行了检查,这显示为true,所以我不知道为什么唯一和重复在这里不起作用。

1 个答案:

答案 0 :(得分:1)

df <- data.frame(x=c(1,2,1,1), y=c(1,4:5,1), z=c(1,7:8,1), w=c(1,2,1,1), t=c(3,4,5,3))
df
#   x y z w t
# 1 1 1 1 1 3
# 2 2 4 7 2 4
# 3 1 5 8 1 5
# 4 1 1 1 1 3

如果您注意到第1行和第4行相同(1 1 1 1 3)。第1列和第4列也是相同的(1 2 1 1)。

duplicated可以找到两种类型:

duplicated(df)
[1] FALSE FALSE FALSE  TRUE

该函数逐行进行并返回重复的逻辑,并在最后找到一个。

对于您正在尝试的列搜索,它最初似乎不起作用:

duplicated(df, MARGIN=2)
[1] FALSE FALSE FALSE  TRUE

这不是预期的。它做了完全相同的事情,逐行搜索。我标记了列,但我仍然提供了data.frameMARGIN参数被忽略。但如果我提供一个矩阵,它可以工作:

duplicated(as.matrix(df), MARGIN=2)
[1] FALSE FALSE FALSE  TRUE FALSE

这是有效的,逐列搜索。我也可以强制函数的矩阵方法:

duplicated.matrix(df, MARGIN=2)
[1] FALSE FALSE FALSE  TRUE FALSE