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