R 基于列值指定类

R 基于列值指定类,r,dplyr,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,

我的数据集如下所示:

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
最终结果将是:

  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
1)一个选项是
收集成'long'格式,按'ID'分组,
过滤
具有
max
'val'的行,然后
通过
粘贴
来汇总
,并取'val'的
第一个

library(tidyverse)
gather(a, key, val, -ID) %>% 
    group_by(ID) %>%
    filter(val == max(val)) %>% 
    summarise(Class = str_c(key, collapse="-"), Max = first(val))
# A tibble: 9 x 3
#  ID    Class     Max
#  <chr> <chr>   <dbl>
#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

3)或使用
数据表

library(data.table)
melt(setDT(a), id.var = 'ID')[, {
     dat <- .SD[value == max(value)]
 .(Class = paste(dat$variable, collapse='-'), Max = dat$value[1])}, by = ID]

使用
apply
的基本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

也许我错了,但我认为你可以通过
a[c(“max”,“class”)]@tmfmnk稍微改进一下。是的,这也是一个有效的建议。谢谢。无论如何,这是一个非常好的解决方案,+1:)
library(data.table)
melt(setDT(a), id.var = 'ID')[, {
     dat <- .SD[value == max(value)]
 .(Class = paste(dat$variable, collapse='-'), Max = dat$value[1])}, by = ID]
Max <- do.call(pmax, a[-1])
Class <-  tapply(names(a)[-1][col(a[-1]) *NA^(a[-1] != Max)], 
     c(row(a[-1])), FUN = function(x)  paste(na.omit(x), collapse='-'))
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
c(val, paste(names(which(x == val)), collapse = "-"))