【问题标题】:Retrieve column name based on values from cell根据单元格中的值检索列名
【发布时间】:2023-03-08 09:46:02
【问题描述】:

我正在尝试完成类似 question 中所示的内容

但是,在我的情况下,我可能会遇到多种情况,其中我有 2 个计算结果为 True 的列:

year cat1 cat2 cat3 ... catN
2000  0    1    1        0
2001  1    0    0        0
2002  0    1    0        1
....
2018  0    1    0        0

在 2000 年以上的 DF 中可以有 cat2 和 cat3 类别。在这种情况下,我如何创建一个新行,它将具有第二个类别。像这样的:

year category 
2000  cat2
2000  cat3
2001  cat1  
2002  cat2
2002  catN 
....
2018  cat2 

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以使用 Tidyverse 中的gather

    library(tidyverse)
    
    data = tribble(
      ~year,~ cat1, ~cat2, ~cat3, ~catN,
      2000,  0,    1,    1,        0,
      2001,  1,    0,    0 ,       0,
      2002,  0,    1,    0,        1
    )
    
    data %>% 
      gather(key = "cat", value = "bool", 2:ncol(.)) %>% 
      filter(bool == 1)
    

    【讨论】:

      【解决方案2】:

      一种方法是获取所有值为 1 的行/列索引,将行索引中的 year 值和列索引中的列名子集化以创建新的数据框。

      mat <- which(df[-1] == 1, arr.ind = TRUE)
      df1 <- data.frame(year = df$year[mat[, 1]], category = names(df)[-1][mat[, 2]])
      df1[order(df1$year), ]
      
      #  year category
      #2 2000     cat2
      #5 2000     cat3
      #1 2001     cat1
      #3 2002     cat2
      #6 2002     catN
      #4 2018     cat2
      

      数据

      df <- structure(list(year = c(2000L, 2001L, 2002L, 2018L), cat1 = c(0L, 
      1L, 0L, 0L), cat2 = c(1L, 0L, 1L, 1L), cat3 = c(1L, 0L, 0L, 0L
      ), catN = c(0L, 0L, 1L, 0L)), class = "data.frame", row.names = c(NA, -4L))
      

      【讨论】:

        【解决方案3】:

        你也可以在reshape2中使用melt

        new_df = melt(df, id.vars='year')
        
        new_df[new_df$value==1, c('year','variable')]
        

        数据

        df = data.frame(year=c(2000,2001),
                        cat1=c(0,1),
                        cat2=c(1,0),
                        cat3=c(1,0))
        

        输出:

          year variable
        2 2001     cat1
        3 2000     cat2
        5 2000     cat3
        

        【讨论】:

          【解决方案4】:

          这是gather 的另一个变体,通过mutate 将具有0 到NA 的列,然后gather 删除NA 元素与na.rm = TRUE

          library(dplyr)
          library(tidyr)
          data %>%
              mutate_at(-1, na_if, y = 0) %>%
              gather(category, val, -year, na.rm = TRUE) %>% 
              select(-val)
          # A tibble: 5 x 2
          #   year category
          #  <dbl> <chr>   
          #1  2001 cat1    
          #2  2000 cat2    
          #3  2002 cat2    
          #4  2000 cat3    
          #5  2002 catN    
          

          数据

          data <- structure(list(year = c(2000, 2001, 2002), cat1 = c(0, 1, 0), 
              cat2 = c(1, 0, 1), cat3 = c(1, 0, 0), catN = c(0, 0, 1)), row.names = c(NA, 
          -3L), class = c("tbl_df", "tbl", "data.frame"))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-04-16
            • 1970-01-01
            • 1970-01-01
            • 2011-05-22
            • 1970-01-01
            • 2020-01-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多