为一个变量创建独特的组

时间:2017-09-13 09:39:11

标签: r dplyr tidyverse

我试图根据一个变量定义不同的组。这是一个简单的问题,但我无法弄清楚。

在我的数据集中,我为每棵树提供了许多独特的组(在“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 ..)的唯一值?

感谢您的帮助。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

以下是使用categoryModel .find({}) .populate( {path: 'subcategories', options: { sort: { '_id': -1 } } } )

的其他选项
data.table