R测试值是不是是组中最低的,如果值是组中最低的,则在新列中添加“是”/“否”

Posted

技术标签:

【中文标题】R测试值是不是是组中最低的,如果值是组中最低的,则在新列中添加“是”/“否”【英文标题】:R test if value is lowest from group, add 'yes'/'no' in new column if value is lowest from groupR测试值是否是组中最低的,如果值是组中最低的,则在新列中添加“是”/“否” 【发布时间】:2021-08-19 03:19:53 【问题描述】:

我对 R 比较陌生,遇到了一个我似乎无法解决的问题。如果之前有人问过这个问题,我深表歉意,但是我在这里遇到的与“找到最低值”相关的答案似乎集中在提取最低值上,我没有发现太多关于使用它作为添加新值的条件一列。

下面是我想要实现的简化示例。我有一个建筑物名称及其使用年份的列表,我想根据建筑物使用的年份是否是第一年,在 first_year 列中添加“是”和“否”。

building_name   year_inuse    first_year
office          2020          yes 
office          2021          no 
office          2022          no
office          2023          no 
house           2020          yes
house           2021          no
house           2022          no
house           2023          no
retail          2020          yes
retail          2021          no
retail          2022          no
retail          2023          no

我按建筑物名称对数据进行了分组,现在我正在考虑执行以下操作:

data_new <- data %>% mutate(first_year = if_else(...., "yes", "no"))

所以在 if_else 中添加一个条件来测试年份是否是组中最低的,如果是,则添加是,否则添加否。但是,我似乎无法弄清楚如何做到这一点,以及这是否是最好的方法。

非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

分组后,您可以获得该组的 min 值,并在比较中使用它,如下所示:

library(dplyr)
data <- tibble::tribble(
  ~building_name, ~year_inuse,
        "office",       2020,
        "office",       2021,
        "office",       2022,
        "office",       2023,
         "house",       2020,
         "house",       2021,
         "house",       2022,
         "house",       2023,
        "retail",       2020,
        "retail",       2021,
        "retail",       2022,
        "retail",       2023
  )

data %>% 
  group_by(building_name) %>% 
  mutate(first_year = if_else(year_inuse == min(year_inuse), 'yes', 'no')) %>% 
  ungroup()

这给了

# A tibble: 12 x 3
   building_name year_inuse first_year
   <chr>              <dbl> <chr>     
 1 office              2020 yes       
 2 office              2021 no        
 3 office              2022 no        
 4 office              2023 no        
 5 house               2020 yes       
 6 house               2021 no        
 7 house               2022 no        
 8 house               2023 no        
 9 retail              2020 yes       
10 retail              2021 no        
11 retail              2022 no        
12 retail              2023 no  

【讨论】:

【参考方案2】:

如果 'year_inuse' 未排序,请在执行此操作之前使用 arrangearrange by 'building_name', 'year_inuse',使用 duplicated 创建逻辑向量,将其转换为数字索引 (1 + ),然后使用该索引替换值向量,即“是”、“否”

library(dplyr)
data_new <- data %>%
        arrange(building_name, year_inuse) %>%
        mutate(first_year = c("no", "yes")[1 + !duplicated(building_name)])

-输出

#    building_name year_inuse first_year
#1          house       2020        yes
#2          house       2021         no
#3          house       2022         no
#4          house       2023         no
#5         office       2020        yes
#6         office       2021         no
#7         office       2022         no
#8         office       2023         no
#9         retail       2020        yes
#10        retail       2021         no
#11        retail       2022         no
#12        retail       2023         no

数据

data <- structure(list(building_name = c("office", "office", "office", 
"office", "house", "house", "house", "house", "retail", "retail", 
"retail", "retail"), year_inuse = c(2020L, 2021L, 2022L, 2023L, 
2020L, 2021L, 2022L, 2023L, 2020L, 2021L, 2022L, 2023L)),
 row.names = c(NA, 
-12L), class = "data.frame")

【讨论】:

以上是关于R测试值是不是是组中最低的,如果值是组中最低的,则在新列中添加“是”/“否”的主要内容,如果未能解决你的问题,请参考以下文章

11-22-33-44-55-66为啥是组播mac地址?

使用 GROUP BY,选择每个组中 ID 最低的记录 ID

GROUP BY 如果组中至少一个值满足条件,则创建组

如何获得组中“中间”值的平均值?

选择组中的第一个和最后一个值

每日一题857. 雇佣 K 名工人的最低成本