【问题标题】:R: How to retrieve a column name of a data frame [duplicate]R:如何检索数据框的列名[重复]
【发布时间】:2019-01-07 20:45:41
【问题描述】:

我正在尝试根据单元格中的值提取数据框的列名。我的数据是几百个类别的系列,单元格中有一个简单的二进制 0 或 1,以指示我想要在我的新 df 中使用哪个列名。

为了说明我的观点:

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

我想得到一个像这样的df:

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

我的代码:

newdf <- as.data.frame(colnames(mydf)[which(mydf == "1", arr.ind = TRUE)[2]])

可惜这只返回一个类别名称!

任何帮助将不胜感激!

【问题讨论】:

  • 仔细查看包dplyrtidyr 或更复杂的data.table。它们旨在做到这一点。

标签: r dataframe


【解决方案1】:

基础 R 解决方案:

使用sapply 查找哪些是并获取名称。

out <- data.frame(year = df1$year, category = names(sapply(df1[, -1], function(x) which(x == 1))))

out
 year category
1 2000     cat1
2 2001     cat2
3 2002     cat3
4 2018     catN

数据:

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

【讨论】:

  • 忍者。发挥了魅力。
  • 因此将上述内容应用于我自己的数据,我应用 as.data.frame 将我的数据强制转换为数据帧,但以上代码与此更改返回:缺少参数“x”,没有默认值...我是不是对某事很敏感?
  • 我已按原样复制代码,将 df1 替换为我的数据框名称。 data 参数中可能缺少什么? (澄清 sapply(df1[,-1] 等中的数据参数是 df1?
  • 输出所有列名或“类别”
  • 完整的 sapply 返回类别及其对应的 0 或 1。名称(sapply...)返回如下所示的内容:[1]“cat1”“cat2”[3]“cat3”“cat4”
【解决方案2】:

一个可能的解决方案是这样的:

library(tidyverse)

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

df %>%
  gather(category, value, -year) %>%  # reshape data
  filter(value == 1) %>%              # keep rows with 1s
  select(-value) %>%                  # remove that column
  arrange(year)                       # order that column (if needed)

#   year category
# 1 2000     cat2
# 2 2001     cat3
# 3 2002     cat1

【讨论】:

    【解决方案3】:

    另一个使用max.col 的选项来自base R

    data.frame(year = dat$year, category = names(dat[-1])[max.col(dat[-1])])
    #  year category
    #1 2000     cat3
    #2 2001     cat1
    #3 2002     catN
    #4 2018     cat2
    

    max.col 在您的数据中查找 1s 的位置(排除第一列)并返回列位置的数字向量,我们使用该向量来对列名称进行子集化,同样排除第一列。

    Rui Barradas 提供的数据。

    【讨论】:

      【解决方案4】:

      这基本上是Reshaping data.frame from wide to long format 的把戏。为此,我将使用包reshape2

      然后选择带有value == 1的行。

      result <- reshape2::melt(dat, id.vars = "year")
      result <- result[result$value == 1, 1:2]
      result <- result[order(result[[1]]), ]
      names(result)[2] <- "category"
      row.names(result) <- NULL
      
      result
      #  year category
      #1 2000     cat3
      #2 2001     cat1
      #3 2002     catN
      #4 2018     cat2
      

      数据。

      dat <- read.table(text = "
      year cat1 cat2 cat3  catN
      2000  0    0    1   0
      2001  1    0    0   0
      2002  0    0    0   1
      2018  0    1    0   0
      ", header = TRUE)
      

      【讨论】:

        【解决方案5】:

        一个简单的解决方案:

        # your data
        data <-data.frame(year =c(2016,2017,2018),
                          cat.1=c(0,1,0),
                          cat.2=c(0,0,1),
                          cat.3 =c(1,0,0))
        
        # a nice library 
        library(reshape2)
        
        # from wide to long
        filtered <- melt(data, id = 'year') %>% filter(value>0) 
        
        # remove the useless column
        filtered <- filtered[,1:2]
            > filtered
          year variable
        1 2017    cat.1
        2 2018    cat.2
        3 2016    cat.3
        

        【讨论】:

          【解决方案6】:

          另一个使用stack的基本R选项

          subset(data.frame(year = df$year, stack(df, select = -year)), values == 1)[-2]
          #   year  ind
          #2  2001 cat1
          #8  2018 cat2
          #9  2000 cat3
          #15 2002 catN
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-05-15
            • 2017-10-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-14
            • 1970-01-01
            相关资源
            最近更新 更多