【问题标题】:Subset dataframe by column value按列值子集数据框
【发布时间】:2021-09-15 20:48:48
【问题描述】:

我是一个缺乏经验的数据管理员,所以请原谅我的简单语言。

我有一个数据框

 df
  sample1 sample2 sample3 median
1       1       2       3      2
2       2       2       5      2
3       5       4       5      5
4       5       6       5      5
5       2       6       6      6

我想取中值列中唯一值对应的所有值。

类似这样的:

median2
[1] 1 2 3 2 2 5

median5
[1] 5 4 5 5 6 5

median6
[1] 2 6 6

我想为大型数据框执行此操作,所以我不想要类似的东西

median2 <- df[df$median == '2',]

【问题讨论】:

    标签: r dataframe


    【解决方案1】:
    out <- by(df, df$median, function(z) unlist(subset(z, select = -median), use.names = FALSE))
    out
    # df$median: 2
    # [1] 1 2 2 2 3 5
    # --------------------------------------------------------------------------------------------------------------------------------------------------- 
    # df$median: 5
    # [1] 5 5 4 6 5 5
    # --------------------------------------------------------------------------------------------------------------------------------------------------- 
    # df$median: 6
    # [1] 2 6 6
    

    意识到by-class 返回实际上只是一个美化的list,所以可以用相同的方式处理它:

    str(out)
    # List of 3
    #  $ 2: int [1:6] 1 2 2 2 3 5
    #  $ 5: int [1:6] 5 5 4 6 5 5
    #  $ 6: int [1:3] 2 6 6
    #  - attr(*, "dim")= int 3
    #  - attr(*, "dimnames")=List of 1
    #   ..$ df$median: chr [1:3] "2" "5" "6"
    #  - attr(*, "call")= language by.data.frame(data = df, INDICES = df$median, FUN = function(z) unlist(subset(z, select = -median), use.names = FALSE))
    #  - attr(*, "class")= chr "by"
    

    【讨论】:

      【解决方案2】:

      这是一个 tidyverse 方法。

      library(tidyverse)
      
      dat1 <- dat |> 
        mutate(median = paste0("median", median)) |> 
        group_by(median) |> 
        summarise(new_var = list(
          as.integer(t(cur_data()))
        )) |> 
        deframe()
      
      dat1
      
      # $median2
      # [1] 1 2 2 2 3 5
      # 
      # $median5
      # [1] 5 5 4 6 5 5
      # 
      # $median6
      # [1] 2 6 6
      

      步骤:

      1. 将每组中值(用cur_data()表示)内的数据帧转换为整数。请注意,它首先使用t() 转换为矩阵以获得所需的数字顺序。

      2. deframe() 来自 tibble 包将列表列转换为命名 列表。

      【讨论】:

        【解决方案3】:

        您可以在将数据框取消列出到向量后使用split

        cols <- grep('sample', names(df))
        split(c(t(df[cols])), paste0('median', rep(df$median, each = length(cols))))
        
        #$median2
        #[1] 1 2 3 2 2 5
        
        #$median5
        #[1] 5 4 5 5 6 5
        
        #$median6
        #[1] 2 6 6
        

        【讨论】:

        • 我将阅读并尝试理解splitrep 的描述,因为我不熟悉这些功能,但非常感谢您的解决方案,它运作良好。
        猜你喜欢
        • 1970-01-01
        • 2014-12-26
        • 1970-01-01
        • 1970-01-01
        • 2016-01-19
        • 2016-11-04
        • 2015-03-28
        • 1970-01-01
        • 2018-09-01
        相关资源
        最近更新 更多