在我的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)
答案 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)