【问题标题】:difference between !duplicated() and unique()!duplicated() 和 unique() 之间的区别
【发布时间】:2023-03-14 02:10:01
【问题描述】:

我不知道这两个函数在 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

不是我想要的;

但 unique() 到底在做什么?

感谢您的帮助。

【问题讨论】:

  • 运行!duplicated(dat$probe)unique(dat$probe);您会看到一个给出了 T/F 值的向量,另一个给出了唯一值的列表。
  • 我认为你的概念问题可以通过查看 unique(dat$prob) 与 !duplicated(dat$prob) 来解决。我认为 ?duplicated 和 ?unique 的每个帮助页面上的第一句话都是有益的阅读。
  • @BrandonBertelsen:是的,确实如此。 :)
  • 谢谢;如果我理解得很好; unique 只返回唯一的探针并丢弃所有出现的多个探针,而重复的帮助我删除重复的。我对吗 ?那么为什么在简单的例子中不是这样呢?以及为什么这两个函数在结果 data.frame 中给出相同数量的行?
  • 假设您的 $probe 列包含数字。考虑:mydata$probe <- c(1,2,3,2,5,4,7,5,6) ;foo<- unique(mydata$probe)。如果你取结果,即 c(1,2,3,5,4,7,6) 并提取 mydata[c(foo),] ,你会得到什么?

标签: r


【解决方案1】:

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)) 将返回字符。

【讨论】:

  • 非常感谢;现在我明白我的错误了;该因子是预期的,但与这些因子关联的数值作为索引返回我 data.frame 的前 6 个元素,而不是唯一元素。重复的绝对是我应该使用的。最后一个问题,如果不是太多;应该使用多么独特以及用于什么目的;就我对 R 的理解水平而言,帮助页面的技术含量有点高(尽管它正在提高)。
  • unique() 有很多用途。一个简单的用例是识别错别字和错误。另一个用例是查看测量事件发生在不规则时间序列中的哪一天。
猜你喜欢
  • 2014-12-07
  • 2012-04-14
  • 2010-10-17
  • 2012-03-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
相关资源
最近更新 更多