首页 > 解决方案 > 根据单元格中的值检索列名

问题描述

我正在尝试完成类似于this 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 的行/列索引,将行索引中的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))

推荐阅读