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

问题描述 投票:0回答:2

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

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

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)))
r
2个回答
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
投票

这是一个仅依赖于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)
© www.soinside.com 2019 - 2024. All rights reserved.