【问题标题】:R - Conditionally select within duplicate IDs and indexR - 在重复的 ID 和索引中有条件地选择
【发布时间】:2018-12-15 08:12:34
【问题描述】:

我有一个包含重复 ID 和不同变量的数据框,如下所示:

x <- 1:10
ID <- c(20,20,55,55,45,45,45,45,45,45)
fruit <- c("Orange", "Apple", "Pear", "Apple", "Blueberries", "Apple", "Banana", "Banana", "Strawberry", "Pear")
df <- cbind(x, ID, fruit)

> df
X   ID   fruit
1   20   Orange
2   20   Apple
3   20   Pear
4   55   Apple
5   55   Blueberries
6   45   Apple
7   45   Banana
8   45   Banana
9   45   Strawberry
10  45   Pear

我需要根据层次结构有条件地索引某些属性(例如,橙 > 蓝莓 > 梨 > 香蕉 > 苹果 > 草莓)要获取的重复 ID 中:

X   ID   fruit
1   20   Orange
5   55   Blueberries
10  45   Pear

说真的,我对如何做到这一点没有好的/简单的想法。有什么想法吗?

【问题讨论】:

  • 我猜你不想使用df &lt;- cbind(...),因为它会生成一个矩阵。你是说df &lt;- data.frame(...) 吗?

标签: r


【解决方案1】:

我们arrange'ID','fruit'基于'OP's post中指定的levels,'X'以'降序'顺序,然后按'ID'分组,slice第一个行

library(dplyr)
df %>% 
  arrange(ID, factor(fruit, levels = c('Orange', 'Blueberries', 'Pear', 
             'Banana','Apple', 'Strawberry')), desc(X)) %>% 
  group_by(ID) %>% 
  slice(1)
# A tibble: 3 x 3
# Groups:   ID [3]
#      X    ID fruit      
#  <int> <int> <chr>      
#1     1    20 Orange     
#2    10    45 Pear       
#3     5    55 Blueberries

数据

df <- structure(list(X = 1:10, ID = c(20L, 20L, 20L, 55L, 55L, 45L, 
45L, 45L, 45L, 45L), fruit = c("Orange", "Apple", "Pear", "Apple", 
"Blueberries", "Apple", "Banana", "Banana", "Strawberry", "Pear"
 )), class = "data.frame", row.names = c(NA, -10L))

【讨论】:

    【解决方案2】:

    假设您只需要每个组中的一行,并且每个组都具有所需的 fruit,我们可以创建一个单独的向量来存储层次结构,并使用 mapply 根据组对其进行子集化。

    hierarc_vec <- c("Orange","Blueberries", "Pear", "Banana","Apple","Strawberry")
    ids <- unique(df$ID)
    
    df[mapply(function(x, y) which.max(df$ID == x & df$fruit == y), 
                         ids, hierarc_vec[1:length(ids)]), ]
    
    
    #    x ID       fruit
    #1   1 20      Orange
    #5   5 55 Blueberries
    #10 10 45        Pear
    

    数据

    x <- 1:10
    ID <- c(20,20,55,55,55,45,45,45,45,45)
    fruit <- c("Orange", "Apple", "Pear", "Apple", "Blueberries", 
               "Apple", "Banana", "Banana", "Strawberry", "Pear")
    df <- data.frame(x, ID, fruit)
    

    【讨论】:

      【解决方案3】:

      爱他们或恨他们,这就是因素设计的目的。

      library('dplyr')
      
      x <- 1:10
      ID <- c(20,20,55,55,45,45,45,45,45,45)
      fruit <- c("Orange", "Apple", "Pear", "Apple", "Blueberries", "Apple", "Banana", "Banana", "Strawberry", "Pear")
      df <- cbind(x, ID, fruit)
      
      df %>%
          as.data.frame() %>%
          mutate(fruit = factor(
              fruit,
              levels = c('Orange','Blueberries','Pear','Banana','Apple','Strawberry'),
              ordered = T
          )) %>%
          group_by(ID) %>%
          arrange(fruit, ID) %>%
          slice(1)
      
      # A tibble: 3 x 3
      # Groups:   ID [3]
        x     ID    fruit      
        <fct> <fct> <ord>      
      1 1     20    Orange     
      2 5     45    Blueberries
      3 3     55    Pear   
      

      【讨论】:

        猜你喜欢
        • 2022-01-02
        • 2021-01-08
        • 1970-01-01
        • 2021-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-26
        相关资源
        最近更新 更多