在R中反转数据帧

时间:2018-09-06 16:48:10

标签: r dataframe inversion

这里举例。参与者将自己喜欢的颜色排列在绿色,蓝色和红色之间。 id代表参与者。每个参与者从1-3中排列三种颜色(最佳= 1,第二喜欢= 2,最不喜欢= 3)。想象一下数据看起来像这样:

         id1      id2     id3
 rank1   red     green    blue
 rank2   green   blue     red
 rank3   blue    red      green

我需要更改值,使其看起来像这样:

        id1   id2    id3
 green   2      1     3
 blue    3      2     1
 red     1      3     2 

基本上,我想用颜色创建一行并记录其排名。我的实际数据框是25列x 100行。我这样做是因为在版本1中,数据输入更加容易。

什么是简便的数据更改方式?

2 个答案:

答案 0 :(得分:3)

sapplymatch到数据框的每一列:

# example data
df <- data.frame(
    id1 = c("red", "green", "blue"),
    id2 = c("green", "blue", "red"),
    id3 = c("blue", "red", "green"),
    stringsAsFactors = FALSE
)

# create ranking dataframe
sapply(df, match, x=c("green", "blue", "red"))

结果:

  id1 id2 id3 
1   2   1   3 
2   3   2   1 
3   1   3   2 

答案 1 :(得分:3)

您可以为此使用tidyr::spread::gather

dat <- read.table(header=TRUE, stringsAsFactors=FALSE, text='
         id1      id2     id3
 rank1   red     green    blue
 rank2   green   blue     red
 rank3   blue    red      green')

library(dplyr)
library(tidyr)

dat %>%
  tibble::rownames_to_column() %>%
  gather(id, color, -rowname) %>%
  spread(id, rowname) %>%
  tibble::column_to_rownames(var="color")
#         id1   id2   id3
# blue  rank3 rank2 rank1
# green rank2 rank1 rank3
# red   rank1 rank3 rank2

column_to_rownames仅仅是为了满足您规范的输出,并不是我建议使用行名。)

如果需要,您可以插入命令以从行中删除rank文本:

dat %>%
  tibble::rownames_to_column() %>%
  mutate(rowname = gsub("\\D", "", rowname)) %>%
  gather(id, color, -rowname) %>%
  spread(id, rowname) %>%
  tibble::column_to_rownames(var="color")
#       id1 id2 id3
# blue    3   2   1
# green   2   1   3
# red     1   3   2

,甚至mutate(rowname = as.integer(gsub("\\D", "", rowname)))(如果您需要将它们设为整数)。