如何删除 R 中的重复行

时间:2021-02-19 07:10:16

标签: r dplyr

在我的df中,我定义了c('apple', 'banana')c('banana', 'apple')是一样的,因为水果类型是一样的,只是排列方式不同。

然后,如何删除第 1 行和第 2 行并只保留最后一行(wanted_df)。

df = data.frame(fruit1 = c('apple', 'banana', 'fig'),
                fruit2 = c('banana', 'apple', 'cherry'))
df

wanted_df = df[3,]

任何帮助将不胜感激!

==============================

我的真实数据有问题。

frames2 丢失了 lag = 2 的行。 我想要像 wanted_frames 这样的数据框。

pollution1 = c('pm2.5', 'pm10', 'so2', 'no2', 'o3', 'co')
pollution2 = c('pm2.5', 'pm10', 'so2', 'no2', 'o3', 'co') 
dis = 'n'
lag = 1:2

frames = expand.grid(pollution1 = pollution1, 
                     pollution2 = pollution2,
                     dis = dis, 
                     lag = lag) %>% 
  mutate(pollution1 = as.character(pollution1),
         pollution2 = as.character(pollution2), 
         dis = as.character(dis)) %>% 
  as_tibble() %>% 
  filter(pollution1 != pollution2)

vec<- with(frames, paste(pmin(pollution1, pollution2), pmax(pollution1, pollution2)))

frames2 = frames[!duplicated(vec), ]

wanted_frames = frames2 %>% mutate(lag = 2) %>% bind_rows(frames2)

3 个答案:

答案 0 :(得分:3)

试试这个。

library(dplyr)
d <- filter(df, !(fruit1 %in% fruit2) | !(fruit2 %in% fruit1))

哪个给了

> d
  fruit1 fruit2
1    fig cherry

更新

正如@JonSpring 和@Phil 所评论的,更新后的代码应该是

df %>% rowwise() %>% filter(!(fruit1 %in% fruit2) | !(fruit2 %in% fruit1))%>% ungroup()

答案 1 :(得分:2)

基本的 R 方法:

vec<- with(df, paste(pmin(fruit1, fruit2), pmax(fruit1, fruit2)))
df[!(duplicated(vec) | duplicated(vec, fromLast = TRUE)), ]

#   fruit1 fruit2
#3    fig cherry

答案 2 :(得分:1)

这是一种低技术的 dplyr 方法。生成一个排序的键,然后保留具有唯一键的行。

library(dplyr)
df %>%
    mutate(key = paste(pmin(fruit1, fruit2), pmax(fruit1, fruit2))) %>%
    add_count(key) %>%
    filter(n == 1)