2017-09-13 9 views
1

1つの変数に基づいて異なるグループを定義しようとしています。これは簡単な質問ですが、わかりませんでした。1つの変数に異なるグループを作成する

私のデータセットでは、私は各ツリーに対して(dist変数に値1の)多数の一意のグループを持っています。新しい変数を作成して、各グループに固有の固有値を割り当てます。

Tree_ID dist 
1  0  
1  1  
1  1  
1  0  
1  1  
1  0  

私は異なるグループ「DIST == 1」のユニークな値(unique_gr)に割り当てる新しい変数を作成したいと思います:

私のデータは次のようになります。

Tree_ID dist unique_gr 
1  0 0 
1  1 1 
1  1 1 
1  0 0 
1  1 2 
1  0 0 

私は「distの== 0」は何のグループ

ifelse(dist == 1, "unique_gr", 0) # checking the current row 

が主な問題は、私は一意の値を指定することができますどのようにしないことを意味する場合、現在の行をチェックするために、「ifelse」機能を使用しようとしました異なるグループごとに異なる/増加する(例えば、1,2,3,4 ..) "unique_gr"の中で?

ありがとうございました。

+0

を使用して別のオプションはこの1つをチェックアウトです:https://stackoverflow.com/questions/25411653/how-do-i-split-a-vector-into-を条件が成立したときのベクトルのリスト/ 25411832#25411832 –

+0

そしてこれ1つ:https://stackoverflow.com/questions/46117904/partition-a-vector-avoiding-a-for-ループ#comment79199345_46117904 –

+0

この提案は@VincentGuillemotありがとうございます。私は正しい道にいると思う。しかし、新しい変数を新しい変数(列)に追加するにはどうすればよいですか? – MPetr

答えて

2

tidyverseおよびdata.tableからの溶液。鍵はrleid機能を使用することです。

# Create example data frame 
dt <- read.table(text = "Tree_ID dist 
1  0  
       1  1  
       1  1  
       1  0  
       1  1  
       1  0 ", 
       header = TRUE, stringsAsFactors = FALSE) 


library(tidyverse) 
library(data.table) 

dt2 <- dt %>% 
    mutate(unique_gr = rleid(dist)) %>% 
    mutate(unique_gr = ifelse(dist != 0 & first(dist) == 0, unique_gr/2, 
          ifelse(dist != 0 & first(dist) != 0, (unique_gr + 1)/2, 0))) 
dt2 
    Tree_ID dist unique_gr 
1  1 0   0 
2  1 1   1 
3  1 1   1 
4  1 0   0 
5  1 1   2 
6  1 0   0 

distの始まりは0ない場合は、このソリューションは、次の例が示すように、動作することに注意してください。ここで

# Create example data frame with the beginning of dist is not 0 
dt_1 <- read.table(text = "Tree_ID dist 
1  1  
       1  1  
       1  1  
       1  0  
       1  1  
       1  0 ", 
       header = TRUE, stringsAsFactors = FALSE) 


dt2_1 <- dt_1 %>% 
    mutate(unique_gr = rleid(dist)) %>% 
    mutate(unique_gr = ifelse(dist != 0 & first(dist) == 0, unique_gr/2, 
          ifelse(dist != 0 & first(dist) != 0, (unique_gr + 1)/2, 0))) 
dt2_1 
    Tree_ID dist unique_gr 
1  1 1   1 
2  1 1   1 
3  1 1   1 
4  1 0   0 
5  1 1   2 
6  1 0   0 
+0

あなたのソリューションに感謝しています。私は 'rleid'機能が鍵であることに同意します。また、先頭が「0」でない場合には、解決策を提案していただきありがとうございます。 – MPetr

1

data.table

library(data.table) 
setDT(df1)[, unique_gr := rleid(dist)*dist, Tree_ID][unique_gr != 0, 
        unique_gr := match(unique_gr, unique(unique_gr))] 
# Tree_ID dist unique_gr 
#1:  1 0   0 
#2:  1 1   1 
#3:  1 1   1 
#4:  1 0   0 
#5:  1 1   2 
#6:  1 0   0 
関連する問題