在R中删除具有相同ID但另一列具有不同值的行

4
我有如下数据框:
id = c("a2887", "a2887", "a5511","a5511","a2806", "a1491", "a1491", "a4309", "a4309") 
plan = c("6V", "6V", "25HS", "50HS", "25HS", "250Mbps", "250Mbps", "15Mbps", "15Mbps") 
df = data.frame(id, plan)

它看起来像:

   id    plan 
a2887      6V
a2887      6V
a5511    25HS
a5511    50HS
a2806    25HS
a1491 250Mbps
a1491 250Mbps
a4309  15Mbps
a4309  15Mbps

我想要删除具有相同ID但在“plan”列中具有不同值的行,仅保留具有唯一ID / plan匹配的行,并创建一个新的数据框,如下所示:
   id    plan
a2887      6V
a2806    25HS
a1491 250Mbps
a4309  15Mbps

有没有一种优雅的方法来实现这个?谢谢!
3个回答

6
我们可以使用tidyverse。按'id'分组后,filter掉只有一个唯一值计划的'id'组,并获取distinct行。
library(dplyr)
df %>%
   group_by(id) %>%
   filter(n_distinct(plan)==1) %>%
   distinct()
# A tibble: 4 x 2
# Groups: id [4]
#  id     plan   
#  <fctr> <fctr> 
#1 a2887  6V     
#2 a2806  25HS   
#3 a1491  250Mbps
#4 a4309  15Mbps 

1
太棒了!感谢分享! - philiporlando

2

data.table解决方案:

library(data.table)
setDT(df)
df <- unique(df)
df[, idx := .N, by = id]
df <- df[!(idx > 1), ]
df[, idx := NULL]

     id    plan
1: a2887      6V
2: a2806    25HS
3: a1491 250Mbps
4: a4309  15Mbps

2

基本的R语言解决方案:

# split df into different groups by id after removing duplicates
df <- unique(df)
df <- split(df, df$id)

# keep those 'groups' with only a single row
df <- df[sapply(df, nrow) == 1]

# bind rows together
df <- do.call(rbind, df)

@ Gregor 你是对的。我编辑了它以删除重复部分。 - Jordi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接