R 根据列删除数据帧中的重复行

R 根据列删除数据帧中的重复行,r,dataframe,R,Dataframe,我有数据帧: df=data.frame(doc_id=c(1, 1, 2, 2), terms=c("virginia","bye","energy","energy"), freq=c(1,1,2,1)) i、 e 我想删除doc_id和terms列中的重复项;例如,第3行和第4行具有相同的文档id和术语字段。但我想保留的副本应该是那些在freq字段中具有最大值的副本。这里有一个slice选项。按“doc_id”、“terms”分组后,用最大值“freq”对行进行切片 library(dp

我有数据帧:

df=data.frame(doc_id=c(1, 1, 2, 2), terms=c("virginia","bye","energy","energy"), freq=c(1,1,2,1))
i、 e

我想删除doc_id和terms列中的重复项;例如,第3行和第4行具有相同的文档id和术语字段。但我想保留的副本应该是那些在freq字段中具有最大值的副本。

这里有一个slice选项。按“doc_id”、“terms”分组后,用最大值“freq”对行进行切片

library(dplyr)
df %>% 
    group_by(doc_id, terms) %>%
    slice(which.max(freq))
# A tibble: 3 x 3
# Groups:   doc_id, terms [3]
#  doc_id terms     freq
#   <dbl> <fct>    <dbl>
#1      1 bye          1
#2      1 virginia     1
#3      2 energy       2
或者排列整齐、清晰

或者在base R中,首先对数据集进行排序,以便“freq”的最大值将出现在每个组的第一行中,然后使用duplicated删除重复的行

df1 <- df[with(df, order(doc_id, terms, -freq)),]
df1[!duplicated(df1[-3]),]
#  doc_id    terms freq
#2      1      bye    1
#1      1 virginia    1
#3      2   energy    2
这里有一个slice选项。按“doc_id”、“terms”分组后,用最大值“freq”对行进行切片

library(dplyr)
df %>% 
    group_by(doc_id, terms) %>%
    slice(which.max(freq))
# A tibble: 3 x 3
# Groups:   doc_id, terms [3]
#  doc_id terms     freq
#   <dbl> <fct>    <dbl>
#1      1 bye          1
#2      1 virginia     1
#3      2 energy       2
或者排列整齐、清晰

或者在base R中,首先对数据集进行排序,以便“freq”的最大值将出现在每个组的第一行中,然后使用duplicated删除重复的行

df1 <- df[with(df, order(doc_id, terms, -freq)),]
df1[!duplicated(df1[-3]),]
#  doc_id    terms freq
#2      1      bye    1
#1      1 virginia    1
#3      2   energy    2

另一个基本R选项:使用subset+ave

或者使用聚合的更紧凑版本,这要归功于@akrun

dfout <- aggregate(freq ~ ., df, FUN = max)

另一个基本R选项:使用subset+ave

或者使用聚合的更紧凑版本,这要归功于@akrun

dfout <- aggregate(freq ~ ., df, FUN = max)

另一个压缩选项是aggregatefreq~,df,FUN=max另一个压缩选项是aggregatefreq~,df,FUN=max谢谢!但它返回:Error:列术语对于first是未知的solution@Mark您的输入数据集将“terms”显示为列名,并且正在为其工作me@Mark有没有可能您的原始数据集中有不同的列名,因为我无法识别您!但它返回:Error:列术语对于first是未知的solution@Mark您的输入数据集将“terms”显示为列名,并且正在为其工作me@Mark有没有可能您的原始数据集中有不同的列名,因为我无法复制
> dfout
  doc_id    terms freq
1      1 virginia    1
2      1      bye    1
3      2   energy    2
dfout <- aggregate(freq ~ ., df, FUN = max)
> dfout
  doc_id    terms freq
1      1      bye    1
2      2   energy    2
3      1 virginia    1