【问题标题】:subset dataframe based on hierarchical preference of factor levels within column in R基于R中列内因子水平的分层偏好的子集数据框
【发布时间】:2020-09-12 04:51:06
【问题描述】:

我有一个数据框,我想根据列中因子级别的分层偏好对其进行子集化。通过以下示例,我想展示每个级别的“ID”我只想选择一个“方法”。具体来说,如果可能保留 CACL,如果此级别不存在 CACL,则为“KCL”子集,如果不存在,则为“H2O”子集。

ID<-c(1,1,1,2,2,3)
method<-c("CACL","KCL","H2O","H2O","KCL","H2O")
df1<-data.frame(ID,method)

  ID  method
1  1    CACL
2  1     KCL
3  1     H2O
4  2     H2O
5  2     KCL
6  3     H2O

ID<-c(1,2,3)
method<-c("CACL","KCL","H2O")
df2<-data.frame(ID,method)

  ID  method
1  1    CACL
2  2     KCL
3  3     H2O

我通过选择关卡中的最小数量来完成类似的子集设置,但我无法调整它。我想知道我是否也应该在这里使用 ifelse?

#if present, choose rows containing "number" 2 instead of 1 (this column contained only the two numbers 1 and 2)

library(dplyr)
new<-df %>%
group_by(col1,col2,col3) %>%
summarize(number = ifelse(any(number > 1), min(number[number>1]),1))
dfnew<-merge(new,df,by=c("colxyz","number"),all.x=T)

【问题讨论】:

    标签: r dataframe subset


    【解决方案1】:

    您可以将ordermatch 一起使用,然后简单地使用!duplicated

    df1 <- df1[order(match(df1$method, c("CACL","KCL","H2O"))),]
    df1[!duplicated(df1$ID),]
    #  ID method
    #1  1   CACL
    #5  2    KCL
    #6  3    H2O
    
    #Variant not changing df1
    i <- order(match(df1$method, c("CACL","KCL","H2O")))
    df1[i[!duplicated(df1$ID[i])],]
    

    【讨论】:

      【解决方案2】:

      使用dplyr的选项:

      df1 %>% 
        mutate(preference = match(method,  c("CACL","KCL","H2O"))) %>% 
        group_by(ID) %>% 
        filter(preference == min(preference)) %>% 
        select(-preference)
      
      # A tibble: 3 x 2
      # Groups:   ID [3]
           ID method
        <dbl> <fct> 
      1     1 CACL  
      2     2 KCL   
      3     3 H2O 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-17
        相关资源
        最近更新 更多