按最高值到最低值的顺序创建包含列名的表

时间:2017-12-18 18:59:18

标签: r

我有一个数据集,按名称记录各种指标的值。我想为每个名称对这些度量标准进行排序,并使用它们创建一个包含每个选项列的新数据集。我有它可以排序行,但我不想要值,我想要指标的名称......

如何获取列名来填充单元格而不是值?

name <- c('jim', 'sal', 'xiu')
x <- c(100, 200, 100)
y <- c(300, 100, 300)
z <- c(400, 0, 200)

have <- data.frame(name, x, y, z)

choice1 <- c('z', 'x', 'y')
choice2 <- c('y', 'y', 'z')
choice3 <- c('x', 'z', 'x')

want <- data.frame(name, choice1, choice2, choice3)

attempt <- data.frame(t(apply(have, 1, sort, decreasing = TRUE)))

2 个答案:

答案 0 :(得分:1)

以下是使用dplyr工具的方法:

library(dplyr)
library(tidyr)
library(reshape2)
have %>% 
  # convert from wide to long format
  gather(metric, value, 
         -name) %>% 
  group_by(name) %>% 
  # arrange each group in descending order
  arrange(desc(value)) %>% 
  # with data arranged, the row number coincides with the ranking
  mutate(rank = sprintf("choice%s", row_number())) %>% 
  # recast to wide format
  dcast(name ~ rank, 
        value.var = "metric")

答案 1 :(得分:1)

这里的解决方案只依赖于tidyverse。

library(tidyverse)

want <- have %>% group_by(name) %>% gather(var, value, 2:4) %>% 
  arrange(name, desc(value)) %>% mutate(choice = paste0("choice", row_number())) %>% 
  select(-value) %>% 
  spread(choice, var)