【问题标题】:Create distinctive groups for one variable为一个变量创建独特的组
【发布时间】:2017-09-13 09:39:11
【问题描述】:

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

在我的数据集中,我为每棵树都有一些独特的组(“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..)?

感谢您的帮助。

【问题讨论】:

标签: r dplyr tidyverse


【解决方案1】:

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

【讨论】:

  • 感谢@ycw 的解决方案。我同意rleid 功能是关键。另外,感谢您在开头不是0时提出解决方案。
【解决方案2】:

这是另一个使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 2017-11-12
    • 2018-08-19
    相关资源
    最近更新 更多