R 通过多个其他列根据组_查找一列的最大值
我在R中有以下表格:R 通过多个其他列根据组_查找一列的最大值,r,dataframe,dplyr,group-by,data-cleaning,R,Dataframe,Dplyr,Group By,Data Cleaning,我在R中有以下表格: | COUNTRY | date_start | code | bin | ord | | -----------------------------------------| | Chile | 04/11/2020 | 4.5.1 | 1 | 3 | | Chile | 04/11/2020 | 4.5.2 | 1 | 0 | | Norway | 23/02/2021 | 4.4.1 | 1 | 2 | | Norway |
| COUNTRY | date_start | code | bin | ord |
| -----------------------------------------|
| Chile | 04/11/2020 | 4.5.1 | 1 | 3 |
| Chile | 04/11/2020 | 4.5.2 | 1 | 0 |
| Norway | 23/02/2021 | 4.4.1 | 1 | 2 |
| Norway | 23/02/2021 | 4.4.2 | 0 | 1 |
| Norway | 25/02/2021 | 4.4.2 | 0 | 1 |
首先我想删除列“who_code”,然后我想创建一个额外的列“ordMax”,并用给定“COUNTRY”和“date_start”的“ord”列的最大值填充它。因此,在本例中,新列为
| COUNTRY | date_start | bin | ord | ordMax |
| ------------------------------------------|
| Chile | 04/11/2020 | 1 | 3 | 3 |
| Chile | 04/11/2020 | 1 | 0 | 3 |
| Norway | 23/02/2021 | 1 | 2 | 2 |
| Norway | 23/02/2021 | 0 | 1 | 2 |
| Norway | 25/02/2021 | 0 | 1 | 1 |
我在R中尝试了几种方法,使用了“聚合”和dplyr库,但似乎没有任何效果。我试过的一件事是:
df_k_reduced <- df_k %>%
group_by(COUNTRY, date_start) %>%
select(-code) %>%
summarise(ordMax = max(ord))
请注意,“bin”和原来的“ord”列也被删除,尽管这不是最初的意图
我如何获得具有该额外列的表,其中唯一删除的列是“code”,并且不删除任何行?我们可以使用
slice\u max
而不是summary
来返回select
步骤之后的所有列
library(dplyr)
df_k %>%
group_by(COUNTRY, date_start) %>%
select(-code) %>%
slice_max(order_by = 'ord', n = 1)
如果需要创建新列,请使用mutate
df_k %>%
group_by(COUNTRY, date_start) %>%
select(-code) %>%
mutate(ordMax = max(ord, na.rm = TRUE)) %>%
ungroup
我们可以使用
slice_max
而不是summary
返回选择
步骤后的所有列
library(dplyr)
df_k %>%
group_by(COUNTRY, date_start) %>%
select(-code) %>%
slice_max(order_by = 'ord', n = 1)
如果需要创建新列,请使用mutate
df_k %>%
group_by(COUNTRY, date_start) %>%
select(-code) %>%
mutate(ordMax = max(ord, na.rm = TRUE)) %>%
ungroup
数据表
方式
样本数据
library(data.table)
DT <- fread("COUNTRY | date_start | code | bin | ord
Chile | 04/11/2020 | 4.5.1 | 1 | 3
Chile | 04/11/2020 | 4.5.2 | 1 | 0
Norway | 23/02/2021 | 4.4.1 | 1 | 2
Norway | 23/02/2021 | 4.4.2 | 0 | 1
Norway | 25/02/2021 | 4.4.2 | 0 | 1 ")
输出
# COUNTRY date_start bin ord ordMax
# 1: Chile 04/11/2020 1 3 3
# 2: Chile 04/11/2020 1 0 3
# 3: Norway 23/02/2021 1 2 2
# 4: Norway 23/02/2021 0 1 2
# 5: Norway 25/02/2021 0 1 1
数据表
方式
样本数据
library(data.table)
DT <- fread("COUNTRY | date_start | code | bin | ord
Chile | 04/11/2020 | 4.5.1 | 1 | 3
Chile | 04/11/2020 | 4.5.2 | 1 | 0
Norway | 23/02/2021 | 4.4.1 | 1 | 2
Norway | 23/02/2021 | 4.4.2 | 0 | 1
Norway | 25/02/2021 | 4.4.2 | 0 | 1 ")
输出
# COUNTRY date_start bin ord ordMax
# 1: Chile 04/11/2020 1 3 3
# 2: Chile 04/11/2020 1 0 3
# 3: Norway 23/02/2021 1 2 2
# 4: Norway 23/02/2021 0 1 2
# 5: Norway 25/02/2021 0 1 1
该方法的作用是用最大值替换现有的“ord”列。是否可以保留原始的“ord”列,同时将这些最大值放在新列中?是的,现在也可以。该方法的作用是用最大值替换现有的“ord”列。是否可以保留原始的“ord”列,同时将这些最大值放在新列中?是的,现在也可以了。听起来很有趣。我还应该补充一点,我的原始表实际上要大得多,并且是一个现有的数据帧(出于这些目的,我将其称为“df_k”)。我尝试了DT
data.table::setDT(df_k)
solibrary(data.table);setDT(df_k)[,ordMax:=max(ord),by=(国家,开始日期)][,code:=NULL][
应该可以正常工作。。(注意:这将永久更改您的df_k-data!)要转换回data.frame,请使用setDF()
Yes,已经完成了。谢谢所以基本上,我用DT听起来很有趣。我还应该补充一点,我的原始表实际上要大得多,并且是一个现有的数据帧(出于这些目的,我将其称为“df_k”)。我尝试了DTdata.table::setDT(df_k)
solibrary(data.table);setDT(df_k)[,ordMax:=max(ord),by=(国家,开始日期)][,code:=NULL][
应该可以正常工作。。(注意:这将永久更改您的df_k-data!)要转换回data.frame,请使用setDF()
Yes,已经完成了。谢谢所以基本上,我用的是DT