Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 对于每行,按最大值对列名进行排序_R_Sorting_If Statement - Fatal编程技术网

R 对于每行,按最大值对列名进行排序

R 对于每行,按最大值对列名进行排序,r,sorting,if-statement,R,Sorting,If Statement,我有一个像这样的数据框 df <- data.frame(name = c("bob", "john", "peter", "chris"), a = c(0, 0, 0, 0), b = c(2, 2, 1, 0), c = c(4, 0, 0, 1), d = c(0, 2, 1, 0), e = c(1, 0, 5, 0)) df name a b c d e 1 bob 0 2 4 0 1 2 john 0 2 0 2 0 3 peter 0 1 0 1 5

我有一个像这样的数据框

df <- data.frame(name = c("bob", "john", "peter", "chris"),
    a = c(0, 0, 0, 0), b = c(2, 2, 1, 0), c = c(4, 0, 0, 1), d = c(0, 2, 1, 0), e = c(1, 0, 5, 0))
df

   name a b c d e
1   bob 0 2 4 0 1
2  john 0 2 0 2 0
3 peter 0 1 0 1 5
4 chris 0 0 1 0 0
我不知道怎么做。

你可以做:

df <- data.frame(name = c("bob", "john", "peter", "chris"),
                 a = c(0, 0, 0, 0), b = c(2, 2, 1, 0), c = c(4, 0, 0, 1), d = c(0, 2, 1, 0), e = c(1, 0, 5, 0))
sortRowNames <- function(x) { x <- x[x!=0]; y <- sort(x, decr=TRUE); paste0(names(y), collapse=',') }
df$new <- apply(df[-1], 1, sortRowNames)
df
# > df
#    name a b c d e   new
# 1   bob 0 2 4 0 1 c,b,e
# 2  john 0 2 0 2 0   b,d
# 3 peter 0 1 0 1 5 e,b,d
# 4 chris 0 0 1 0 0     c

df这里有一个
收集
/
传播
的方法,可以通过
tidyverse
来实现

library(tidyverse)

df %>% 
 gather(var, val, -name) %>% 
 group_by(name) %>% 
 arrange(-val) %>% 
 mutate(output = toString(var[val != 0])) %>% 
 spread(var, val) %>% 
 select(name, output)
这就给了,

#一个tible:4 x 2
#分组:名称[4]
名称输出
1鲍勃c、b、e
2克里斯·c
约翰·b·d·3
4彼得e、b、d
sortRow2 <- function(x) paste0(names(sort(x[x!=0], decr=TRUE)), collapse=',')
library(tidyverse)

df %>% 
 gather(var, val, -name) %>% 
 group_by(name) %>% 
 arrange(-val) %>% 
 mutate(output = toString(var[val != 0])) %>% 
 spread(var, val) %>% 
 select(name, output)
# A tibble: 4 x 2
# Groups:   name [4]
  name  output 
  <chr> <chr>  
1 bob   c, b, e
2 chris c      
3 john  b, d   
4 peter e, b, d