r - 列内の同一の値の各グループに一意の ID 番号を割り当てる方法

okwaves2024-01-24  6

この質問にはすでに答えがあります: グループごとに ID 列を追加 [重複]

(答えは4つ)

7 年前

に閉店しました。

多数の列を含むデータ フレームがあります。 「id」という名前の新しい列を作成して、「sample」列内の同一の値の各グループに一意の ID 番号を付与したいと思います。

データ例:

df <- data.frame(
  index = 1:30,
  val = c(
    14L, 22L, 1L, 25L, 3L, 34L, 35L, 36L, 24L, 35L, 33L, 31L, 30L,
    30L, 29L, 28L, 26L, 12L, 41L, 36L, 32L, 37L, 56L, 34L, 23L, 24L,
    28L, 22L, 10L, 19L
  ),
  sample = c(
    5L, 6L, 6L, 7L, 7L, 7L, 8L, 9L, 10L, 11L, 11L, 12L, 13L, 14L,
    14L, 15L, 15L, 15L, 16L, 17L, 18L, 18L, 19L, 19L, 19L, 20L, 21L,
    22L, 23L, 23L
  )
)

最終的にやりたいことは次のとおりです。

  index val sample id
1     1  14      5  1
2     2  22      6  2
3     3   1      6  2
4     4  25      7  3
5     5   3      7  3
6     6  34      7  3

1

dplyr ソリューション: df$id <- group_indices(df$sample)。

– user3932000

2019 年 7 月 29 日 22:04



------------------------

どうですか

df2 <- transform(df,id=as.numeric(factor(sample)))

?

これ ([グループごとに ID を追加] 列から抜粋) はもう少し効率的になるはずですが、おそらく少し覚えにくいかもしれません。

df3 <- transform(df, id=match(sample, unique(sample)))
all.equal(df2,df3)  ## TRUE

やりたい場合は、彼の Tidyverse 内:

library(dplyr)
df %>% group_by(sample) %>% mutate(id=cur_group_id())

6

1

気に入っています: 私が理解できる要素の使用法。 :-)

– カール・ウィトフト

2014 年 6 月 9 日 12:09

1

ここで少し注意してください: as.numeric(factor(sample)) メソッドは降順の数値シーケンスのみを生成します。サンプルはすでに注文されています。

– デヴィッド・アレンバーグ

2016 年 5 月 5 日 15:10

1

factor() ソリューションの優れた点は、NA 値を無視することです

– ウィル T-E

2016 年 11 月 17 日 10:16

@Ben Bolker、ありがとう! dplでコードを書けますか年?

– アレックス

2021 年 2 月 23 日 21:41

上記のコメントを見ましたか stackoverflow.com/questions/24119599/… ?

– ベン・ボルカー

2021 年 2 月 23 日 21:42



------------------------

これが data.table ソリューションです

library(data.table)
setDT(df)[, id := .GRP, by = sample]

0

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。