GROUP_BYからのグループ番号でデータテーブルの番号/ラベルを付けますか?

StackOverflow https://stackoverflow.com//questions/23026145

  •  21-12-2019
  •  | 
  •  

質問

私は、group_by(u, v)で観測された個別の整数の組み合わせごとに(u, v)を求めたいTBL_DFを持っています。


編集:これは、 DplyR 0.4.0に戻すことによって、これは解決されました。 / a>


a)それぞれの異なるグループの任意の異なる数字ラベル= 1,2,3を割り当てたいです。 例えば組み合わせ(u、v)==(2,3)はラベル1を取得することができ、(1,3)は2を得ることができます。 3段階の要約と自己結合なしで、1つのgroup_indices()でこれを行う方法?

DPLYRには、ニート関数mutate()がありますが、の中の要素数の数、の全体的な数。 n()これは、これをdata.table と呼ばれます。

b)実際に私が本当に文字列/文字ラベルを割り当てたいもの( 'a'、 'b'、...)。 しかし、整数による番号付けグループは、以下のように.GRPを使用できるため、十分です。これら2つをマージするための賢い方法がない限り?しかし、この部分を汗をかいてはいけません。

set.seed(1234)

# Helper fn for mapping integer 1..26 to character label
integer_to_label <- function(i) { substr("ABCDEFGHIJKLMNOPQRSTUVWXYZ",i,i) }

df <- tbl_df(data.frame(u=sample.int(3,10,replace=T), v=sample.int(4,10,replace=T)))

# Want to label/number each distinct group of unique (u,v) combinations
df %>% group_by(u,v) %>% mutate(label = n()) # WRONG: n() is number of element within its group, not overall number of group

   u v
1  2 3
2  1 3
3  1 2
4  2 3
5  1 2
6  3 3
7  1 3
8  1 2
9  3 1
10 3 4

KLUDGE 1: could do df %>% group_by(u,v) %>% summarize(label = n()) , then self-join
.

役に立ちましたか?

解決

更新回答

get_group_number = function(){
    i = 0
    function(){
        i <<- i+1
        i
    }
}
group_number = get_group_number()
df %>% group_by(u,v) %>% mutate(label = group_number())
.

次のわずかに読みませんが、

を考慮することもできます。
group_number = (function(){i = 0; function() i <<- i+1 })()
df %>% group_by(u,v) %>% mutate(label = group_number())
.


iteratorsパッケージの使用

library(iterators)

counter = icount()
df %>% group_by(u,v) %>% mutate(label = nextElem(counter))
.

他のヒント

DPLYRには、次のように使用できるgroup_indices()関数があります。

df %>% 
    mutate(label = group_indices(., u, v)) %>% 
    group_by(label) ...
.

data.tableを使用した別のアプローチは

です。
require(data.table)
setDT(df)[,label:=.GRP, by = c("u", "v")]
.

どの結果:

    u v label
 1: 2 1     1
 2: 1 3     2
 3: 2 1     1
 4: 3 4     3
 5: 3 1     4
 6: 1 1     5
 7: 3 2     6
 8: 2 3     7
 9: 3 2     6
10: 3 4     3
.

3つの異なる方法で私の答えを更新する:

A)interaction(u,v)を用いた純粋な非DPLYRソリューション:

> df$label <- factor(interaction(df$u,df$v, drop=T))
 [1] 1.3 2.3 2.2 2.4 3.2 2.4 1.2 1.2 2.1 2.1
 Levels: 2.1 1.2 2.2 3.2 1.3 2.3 2.4

> match(df$label, levels(df$label)[ rank(unique(df$label)) ] )
 [1] 1 2 3 4 5 4 6 6 7 7
.

b)ランディのきちんとしたファストアンドダーティジェネレータ - 関数の回答をよりコンパクトに回答する:

get_next_integer = function(){
  i = 0
  function(u,v){ i <<- i+1 }
}
get_integer = get_next_integer() 

df %>% group_by(u,v) %>% mutate(label = get_integer())
.


c)ここでもここでは、この

i <- 0
generate_integer <- function() { return(assign('i', i+1, envir = .GlobalEnv)) }

df %>% group_by(u,v) %>% mutate(label = generate_integer())

rm(i)
.

コメントの評判が足りないので、代わりに答えを投稿しています。

因子を使用した解決策は良いものですが、因子数がそのレベルをアルファベット順にした後にグループ数が割り当てられているという欠点があります。DPLYRのgroup_indices()でも同じ動作が発生します。現在のグループの順序に基づいて、グループ番号を1からNに割り当てることをおそらくご希望ですか。その場合は、次のようにします。

my_tibble %>% mutate(group_num = as.integer(factor(group_var, levels = unique(.$group_var))) )
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top