这里举例。参与者将自己喜欢的颜色排列在绿色,蓝色和红色之间。 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中,数据输入更加容易。
什么是简便的数据更改方式?
答案 0 :(得分:3)
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
答案 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)))
(如果您需要将它们设为整数)。