40

all_data私は、サイト (1... から n) のリストとそのスコアを含むデータ フレーム ( ) を持っています。

  site  score
     1    10
     1    11  
     1    12
     4    10 
     4    11
     4    11
     8    9
     8    8
     8    7

カウンターのように、サイトの各レベルを番号順に並べた列を作成したいと思います。この例では、サイト (1、4、および 8) の「番号」列に 1 から 3 までの対応するカウンターがあります。

site  score number
     1    10    1
     1    11    1 
     1    12    1 
     4    10    2
     4    11    2
     4    11    2
     8    9     3
     8    8     3 
     8    7     3

これは簡単に解決できるに違いないと確信していますが、まだ方法を見つけていません。

4

11 に答える 11

29

試すData$number <- as.numeric(as.factor(Data$site))

余談ですが、私と@Chaseの解決策と@DWinの解決策の違いは、数字の順序です。as.factorとの両方factorがレベルを自動的にソートしますが、 @DWin のソリューションでは発生しません。

Dat <- data.frame(site = rep(c(1,8,4), each = 3), score = runif(9))

Dat$number <- as.numeric(factor(Dat$site))
Dat$sitenum <- match(Dat$site, unique(Dat$site) ) 

与える

> Dat
  site     score number sitenum
1    1 0.7377561      1       1
2    1 0.3131139      1       1
3    1 0.7862290      1       1
4    8 0.4480387      3       2
5    8 0.3873210      3       2
6    8 0.8778102      3       2
7    4 0.6916340      2       3
8    4 0.3033787      2       3
9    4 0.6552808      2       3
于 2011-05-24T15:32:31.650 に答える
23

その他の 2 つのオプション:

1)パッケージの.GRP関数を使用する:data.table

library(data.table)
setDT(dat)[, num := .GRP, by = site]

以下のサンプル データセットを使用すると、次のようになります。

> dat
    site      score num
 1:    1 0.14945795   1
 2:    1 0.60035697   1
 3:    1 0.94643075   1
 4:    8 0.68835336   2
 5:    8 0.50553372   2
 6:    8 0.37293624   2
 7:    4 0.33580504   3
 8:    4 0.04825135   3
 9:    4 0.61894754   3
10:    8 0.96144729   2
11:    8 0.65496051   2
12:    8 0.51029199   2

2)group_indicesからの関数の使用dplyr:

dat$num <- group_indices(dat, site)

または、標準外の評価を回避したい場合:

library(dplyr)
dat %>% 
  mutate(num = group_indices_(dat, .dots = c('site')))

結果は次のとおりです。

   site      score num
1     1 0.42480366   1
2     1 0.98736177   1
3     1 0.35766187   1
4     8 0.06243182   3
5     8 0.55617002   3
6     8 0.20304632   3
7     4 0.90855921   2
8     4 0.25215078   2
9     4 0.44981251   2
10    8 0.60288270   3
11    8 0.46946587   3
12    8 0.44941782   3

ご覧のとおりdplyr、グループ番号の順序が異なります。


グループが変わるたびに別の番号が必要な場合は、他にもいくつかのオプションがあります。

1)ベース R:

# option 1:
dat$num <- cumsum(c(TRUE, head(dat$site, -1) != tail(dat$site, -1)))

# option 2:
x <- rle(dat$site)$lengths
dat$num <- rep(seq_along(x), times=x)

2)パッケージdata.table:

library(data.table)
setDT(dat)[, num := rleid(site)]

すべての結果:

> dat
   site      score num
1     1 0.80817855   1
2     1 0.07881334   1
3     1 0.60092828   1
4     8 0.71477988   2
5     8 0.51384565   2
6     8 0.72011650   2
7     4 0.74994627   3
8     4 0.09564052   3
9     4 0.39782587   3
10    8 0.29446540   4
11    8 0.61725367   4
12    8 0.97427413   4

使用データ:

dat <- data.frame(site = rep(c(1,8,4,8), each = 3), score = runif(12))
于 2016-09-26T15:43:39.577 に答える
16

これはかなり効率的で理解しやすいはずです。

Dat$sitenum <- match(Dat$site, unique(Dat$site))  
于 2011-05-24T15:38:52.037 に答える
14

新しいdplyr1.0.0ではcur_group_id()、グループに一意の数値識別子を与える を使用できます。

library(dplyr)
df %>% group_by(site) %>% mutate(number = cur_group_id())

#  site score number
#  <int> <int>  <int>
#1     1    10      1
#2     1    11      1
#3     1    12      1
#4     4    10      2
#5     4    11      2
#6     4    11      2
#7     8     9      3
#8     8     8      3
#9     8     7      3

データ

df <- structure(list(site = c(1L, 1L, 1L, 4L, 4L, 4L, 8L, 8L, 8L), 
score = c(10L, 11L, 12L, 10L, 11L, 11L, 9L, 8L, 7L)), 
class = "data.frame", row.names = c(NA, -9L))
于 2020-06-10T00:12:29.500 に答える
3

サイトを因子に変換し、その因子の数値または整数値を返すことができます。

dat <- data.frame(site = rep(c(1,4,8), each = 3), score = runif(9))
dat$number <- as.integer(factor(dat$site))
dat

  site     score number
1    1 0.5305773      1
2    1 0.9367732      1
3    1 0.1831554      1
4    4 0.4068128      2
5    4 0.3438962      2
6    4 0.8123883      2
7    8 0.9122846      3
8    8 0.2949260      3
9    8 0.6771526      3
于 2011-05-24T15:35:29.650 に答える