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' 未排序,请在执行此操作之前使用 arrange
即 arrange
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测试值是不是是组中最低的,如果值是组中最低的,则在新列中添加“是”/“否”的主要内容,如果未能解决你的问题,请参考以下文章