!duplicated()和unique()之间的区别

时间:2012-11-07 17:03:50

标签: r

我无法弄清楚R中这两个函数之间的区别是什么。 我有一个data.frame,我想删除对应于给定列中重复值的行;

    Acc         Probe             Coord_homol
1   NR_004442.1 225541_at~122     391
2   NM_028059.2 241348_at~444     4642
3   NM_028059.2 241348_at~468     4666
4   NM_001114   212306_at~4357    5034
5   NM_010573.2 230472_at~402     1987
6   NM_029633.2 212306_at~4357    4289
7   NM_00108196 212306_at~4357    4292
8   NM_029891.2 205004_at~3421    2963
9   NM_029891.2 205004_at~3635    3173
10  NM_007892.2 221586_s_at~1356 1257
11  NR_036613.1 208672_s_at~829  1301
12  NR_036613.1 208673_s_at~1472 1854
13  NM_011078.3 212726_at~3872    5175
14  NM_011078.3 212726_at~3887    5190
15  NM_013915.3 207164_s_at~1523 2911

在这种情况下,我想删除第7行,因为探针与第6行中的相同(具有相同探针的行不必是连续的)。

我首先尝试使用unique(),后来发现重复。 但如果以下命令

dat[!duplicated(dat$probe),]

dat[unique(dat$probe),]

在结果data.frame中给出相同数量的行,结果不一样。

我尝试了一个更简单的案例,如下所示:

一个简单的data.frame:

> dat
   probe val
1    aaa  10
2    bbb  12
3    ccc  45
4    ddd  32
5    aaa  42
6    eee  10
7    fff  13
8    ccc  85
9    aaa  75
10   ddd  64

使用!duplicated():它似乎就是我想要做的;

dat[!duplicated(dat$probe),]

  probe val
1   aaa  10
2   bbb  12
3   ccc  45
4   ddd  32
6   eee  10
7   fff  13

使用unique():

dat[unique(dat$probe),]

我明白了:

 probe val
1   aaa  10
2   bbb  12
3   ccc  45
4   ddd  32
5   aaa  42
6   eee  10

不是我想要的;

但是究竟是什么独特的()呢?

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

unique返回一个因子,因子的数字级别用于索引而不是标签。

uni <- unique(dat$probe)
str(uni)
 Factor w/ 6 levels "aaa","bbb","ccc",..: 1 2 3 4 5 6

就像你这样做:

nums <- as.numeric(unique(dat$probe))
dat[nums,]
  probe val
1   aaa  10
2   bbb  12
3   ccc  45
4   ddd  32
5   aaa  42
6   eee  10

unique正在返回一个因素,因为在这种情况下我们会考虑一个因素。它并不总是返回因素。例如,unique(as.character(dat$probe))将返回字符。