Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 通过多个其他列根据组_查找一列的最大值_R_Dataframe_Dplyr_Group By_Data Cleaning - Fatal编程技术网

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 |

我在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  | 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)
so
library(data.table);setDT(df_k)[,ordMax:=max(ord),by=(国家,开始日期)][,code:=NULL][
应该可以正常工作。。(注意:这将永久更改您的df_k-data!)要转换回data.frame,请使用
setDF()
Yes,已经完成了。谢谢所以基本上,我用DT听起来很有趣。我还应该补充一点,我的原始表实际上要大得多,并且是一个现有的数据帧(出于这些目的,我将其称为“df_k”)。我尝试了DT
data.table::setDT(df_k)
so
library(data.table);setDT(df_k)[,ordMax:=max(ord),by=(国家,开始日期)][,code:=NULL][
应该可以正常工作。。(注意:这将永久更改您的df_k-data!)要转换回data.frame,请使用
setDF()
Yes,已经完成了。谢谢所以基本上,我用的是DT