2017-09-13 33 views
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 

我曾尝试使用“ifelse”功能来检查当前行,当“DIST == 0”表示没有组

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

的主要问题是我怎么可以指定唯一值在“unique_gr”中,对于每个不同的组是不同的/增加的(例如1,2,3,4 ..)?

谢谢你的帮助。

+0

检查这一个另一种选择:https://stackoverflow.com/questions/25411653/how-do-i-split-a-vector-into-向列表的时候,满足条件/ 25411832#25411832 –

+0

而这一个:https://stackoverflow.com/questions/46117904/partition-a-vector-avoiding-a-for-循环#comment79199345_46117904 –

+0

谢谢@VincentGuillemot对此建议。我想我正走在正确的轨道上。但是,如何将新组添加到新变量(列)? – MPetr

回答

2

来自tidyversedata.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

谢谢@ycw您的解决方案。我同意'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 
相关问题