代码之家  ›  专栏  ›  技术社区  ›  Student

反转R中的数据帧

  •  2
  • Student  · 技术社区  · 7 年前

    这里是一个例子。参与者将他们最喜欢的颜色排列在绿色、蓝色和红色之间。 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列x100行。我这样做是因为在版本1中数据输入更容易。

    改变数据最简单的方法是什么?

    2 回复  |  直到 7 年前
        1
  •  3
  •   DanY    7 年前

    sapply match

    # 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 
    
        2
  •  3
  •   r2evans    7 年前

    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
    

    (The) 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))) 如果你需要它们是整数。