r - 基于列值的类分配

标签 r dplyr

我有如下数据集:

a <- structure(list(ID = c("a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9"), 
                    E = c(1, 0, 0, 0,4, 4, 3, 0,1), 
                    W = c(0, 3, 2, 0, 3, 3, 3, 4,1), 
                    N = c(1, 0, 2, 0, 3, 4, 3, 7,1), 
                    S=c(0, 0, 0, 2, 1, 1, 3, 0,1)), 
               .Names = c("ID", "E", "W", "N", "S"), row.names = c(NA, -9L), class = "data.frame")
a
  ID E W N S
1 a1 1 0 1 0
2 a2 0 3 0 0
3 a3 0 2 2 0
4 a4 0 0 0 2
5 a5 4 3 3 1
6 a6 4 3 4 1
7 a7 3 3 3 3
8 a8 0 4 7 0
9 a9 1 1 1 1

我想创建一个 class 列,它将根据每行的最大数量显示 column name。例如,ID 为 a2 的第二行的 W 列的最大值 为 3。类将为 W,最大值将为 3。当最大值 出现平局时,它将包括所有平局的列名称。例如,对于第 1 行 (ID=a1),E 列和 N 列都具有相同的最大值,因此该类将定义为 E-N,最大值将为 1。

我已经开始使用 melt 函数:

library(reshape2)
a1= melt(a, id=c("ID"))
head(a1)
  ID variable value
1 a1        E     1
2 a2        E     0
3 a3        E     0
4 a4        E     0
5 a5        E     4
6 a6        E     4

最终输出将是:

  ID   Class Max
1 a1     E-N   1
2 a2       W   3
3 a3     W-N   2
4 a4       S   2
5 a5       E   4
6 a6     E-N   4
7 a7 E-W-N-S   3
8 a8       N   7
9 a9 E-W-N-S   1

最佳答案

使用 apply 的 Base R 方法是在每一行中找到 max 并找到相应的列名。

a[c("max", "class")] <- t(apply(a[-1], 1, function(x) {
      val <- max(x)
      c(val, paste(names(a)[-1][x == val], collapse = "-"))
}))

a[c(1, 6, 7)]
#  ID   max   class
#1 a1     1     E-N
#2 a2     3       W
#3 a3     2     W-N
#4 a4     2       S
#5 a5     4       E
#6 a6     4     E-N
#7 a7     3 E-W-N-S
#8 a8     7       N
#9 a9     1 E-W-N-S

您还可以使用 which 获取列名(如@tmfmnk 所建议),将 apply 中的最后一行替换为

c(val, paste(names(which(x == val)), collapse = "-")) 

关于r - 基于列值的类分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56306415/

相关文章:

r - 如何用 dplyr 替换多列中的 NA

r - 如何使用JDBC/Hive构建一个运行Shiny应用程序的Dockerfile(需要rJava)?

R 将数字/字符转换为上标或下标

r - 如何将列中的某些值转换为负数

R - 将向量传递给自定义函数到 dplyr::mutate

r - 错误: Results are not data frames at positions:

r - 在 dplyr 中使用 'window' 函数

r - 按使用的包搜索 R 文件

r - 如何在箱线图中绘制与水平箱线图平行的条形图以及箱线图中的面积分数?

r - quantstrat:在开盘时买入下一根柱线