【问题标题】:How to map names of factors having identical levels but different length?如何映射具有相同水平但长度不同的因素的名称?
【发布时间】:2017-05-29 11:00:42
【问题描述】:

我有两个因子 tIDfff 具有相同的水平,但长度不同,分别为 45000000 和 23000:

> head(factor(tID))
Fungi Metazoa   Fungi   Fungi   Fungi   Fungi 
227321   79782   52586 1658174  573508   88771

Levels: 2 7 9 11 14 16 17 19 20 22 23 24 32 33 34 38 39 41 42 43 47 48 51 52 54 56 61 68 69 72 75 81 85 86 103 104 106 114 119 120 122 124 125 128 134 140 141 142 143 144 148 154 158 159 162 163 165 167 171 172 173 174 179 ... 1985254

head(fff)
[1] 4932   870730 34413  4932   4932   9606  
Levels: 2 7 9 11 14 16 17 19 20 22 23 24 32 33 34 38 39 41 42 43 47 48 51 52 54 56 61 68 69 72 75 81 85 86 103 104 106 114 119 120 122 124 125 128 134 140 141 142 143 144 148 154 158 159 162 163 165 167 171 172 173 174 179 ... 1985254

有没有更快的方法将名称从因子 tID 映射到 fff

我知道我可以使用 lappy()sapply() 来做到这一点,但这些因子包含 450 万个元素,所以它有点慢。

【问题讨论】:

  • 你能显示预期的输出吗?
  • 我说你想做一个join操作。
  • 再次,您更改了向量名称。请在此问题修复后通知我们

标签: r factors levels


【解决方案1】:

使用namesmatch

names(fa) <- names(fb)[match(fa, fb)]

你得到:

> fa
 name_1  name_1  name_1  name_6  name_6  name_6 name_11 name_11 name_11 name_16 name_16 name_16 name_21 name_21 name_21 
      a       a       a       b       b       b       c       c       c       d       d       d       e       e       e 
Levels: a b c d e

对于问题中的新示例,这应该是:

names(fff) <- names(tID)[match(fff, tID)]

示例数据:

fa <- factor(rep(letters[1:5], each = 3))
fb <- factor(rep(letters[1:5], each = 5))
fb <- setNames(fb, paste0('name_',seq_along(fb)))

【讨论】:

  • 我无法使用粘贴创建名称。我展示的那个是一个例子。原始示例中的名称不容易通过粘贴来创建
  • @Chirag 喜欢我的回答:names(fff) &lt;- names(tID)[match(fff, tID)]
  • @Chirag 如果您对 Q 的回答令您满意,您应该点击绿色复选标记符号接受正确答案。谢谢。
  • @UweBlock 完成!
猜你喜欢
  • 2019-02-07
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 2019-12-17
  • 1970-01-01
相关资源
最近更新 更多