【问题标题】:How to modify data frame in R based on one unique column如何根据一个唯一列修改R中的数据框
【发布时间】:2021-04-29 18:25:26
【问题描述】:

我有一个看起来像这样的数据框。

数据

Denmark         MG301
Denmark         MG302
Australia       MG301
Australia       MG302
Sweden          MG100
Sweden          MG120

我需要根据第二列的唯一值创建一个新的数据框,同时删除丹麦的重复值。结果应该是这样的

数据

Australia       MG301
Australia       MG302
Sweden          MG100
Sweden          MG120

问候

【问题讨论】:

  • 嗨,您能否在您的问题中提供一个可重现的数据集/示例?这将有助于找到您问题的解决方案:)
  • 您确定您的数据正确吗?
  • 已删除丹麦的重复值或所有值?
  • 无论丹麦如何,我都想整体删除重复值,但丹麦也可以这样做。我不确定我说的是否正确
  • @RobinTurkington Cohort= c("UK","UK","UK","Sweden","Sweden","Sweden","France","France","France") IDs=c("Fam100","Fam123","Fam306","Fam232","Fam123","Fam160","Fam323","Fam129","Fam330") df=data.frame(群组,IDs) df 你可以看到英国和瑞典都有 fam123 的共同点,我想只保留其中一个而忽略其他。

标签: r dataframe unique


【解决方案1】:

澄清后更新:

此代码将所有不同的值保留在 column2 中:

distinct(df, code, .keep_all = TRUE)

输出:

1 Denmark   MG301
2 Australia MG302
3 Sweden    MG100
4 Sweden    MG120

第一个答案: 我不太确定。但它提供了所需的输出:

df %>% 
  filter(country != "Denmark")

输出:

  country   code 
  <chr>     <chr>
1 Australia MG301
2 Australia MG302
3 Sweden    MG100
4 Sweden    MG120

数据:

df<- tribble(
  ~country, ~code,
"Denmark", "MG301", 
  "Denmark", "MG301", 
  "Australia", "MG301", 
  "Australia", "MG302", 
  "Sweden", "MG100", 
  "Sweden", "MG120")

【讨论】:

  • 我想在第二列中保留唯一值,是否会导致从第一列中删除任何变量。
【解决方案2】:

在基础 R 中,以下代码删除第一列中所有带有 "Denmark" 的行,并按第一列的组删除所有重复的第二列。

i <- df1$V1 != "Denmark"
j <- as.logical(ave(df1$V2, df1$V1, FUN = duplicated))
df1[i & !j, ]
#         V1    V2
#3 Australia MG301
#4 Australia MG302
#5    Sweden MG100
#6    Sweden MG120

【讨论】:

    【解决方案3】:

    你想要独特的吗?那么这可能会有所帮助

    df <- data.frame(A = c("denmark", "denmark", "Australia", "Australia", "Sweden", "Sweden"), B = c("MG301","MG302","MG301","MG302","MG100","MG100"))
    
    df %>% distinct()
    
              A     B
    1   denmark MG301
    2   denmark MG302
    3 Australia MG301
    4 Australia MG302
    5    Sweden MG100
    
    

    或者你想要这个?

    df %>% 
        group_by(B) %>% 
        dplyr::summarise(A = first(A))
    
      B     A      
    * <chr> <chr>  
    1 MG100 Sweden 
    2 MG301 denmark
    3 MG302 denmark
    

    【讨论】:

      【解决方案4】:

      使用duplicated! bang 运算符来删除该列中的重复行。 为了展示一个相当复杂的案例,我在丹麦添加了一行,它没有重复,因此不应该被过滤掉。

      df<- tribble(
        ~country, ~code,
        "Denmark", "MG301", 
        "Denmark", "MG302",
        'Denmark', "MG303",
        "Australia", "MG301", 
        "Australia", "MG302", 
        "Sweden", "MG100", 
        "Sweden", "MG120")
      
      # A tibble: 7 x 2
        country   code 
        <chr>     <chr>
      1 Denmark   MG301
      2 Denmark   MG302
      3 Denmark   MG303
      4 Australia MG301
      5 Australia MG302
      6 Sweden    MG100
      7 Sweden    MG120
      
      df %>% 
        mutate(d = duplicated(code)) %>%
        group_by(code) %>%
        mutate(d = sum(d)) %>% ungroup() %>%
        filter(!(d > 0 & country == 'Denmark'))
      
      # A tibble: 5 x 3
        country   code      d
        <chr>     <chr> <int>
      1 Denmark   MG303     0
      2 Australia MG301     1
      3 Australia MG302     1
      4 Sweden    MG100     0
      5 Sweden    MG120     0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-21
        • 2018-11-24
        • 2019-01-20
        • 1970-01-01
        • 2021-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多