在r中将数据从宽格式更改为长格式

时间:2013-06-10 19:59:55

标签: r reshape

我有数据,学生可以通过两个评分者对多个问题进行评分。每行包含以下变量:

  • 学生证,
  • 第一个项目的第一个评估者的ID
  • 第一个评估者为第一个项目分配的评分,
  • 第一个项目的第二个评估者的ID
  • 第二个评估者为第一个项目分配的评级

....然后它会重复多个项目。

它看起来像这样:

Student_ID  <- c(1:4)
Item1_first_rater_id <- c(1,2,1,2)
Item1_first_rating <- c(2,3,4,2)
Item1_second_rater_id <- c(2,3,2,3)
Item1_second_rating <- c(4,5,3,2)
Item2_first_rater_id <- c(4,2,5,1)
Item2_first_rating <- c(2,3,4,2)
Item2_second_rater_id <- c(6,7,2,3)
Item2_second_rating <- c(3,4,5,4)

wide <- data.frame(Student_ID, Item1_first_rater_id, Item1_first_rating, 
                          Item1_second_rater_id, Item1_second_rating, 
                          Item2_first_rater_id, Item2_first_rating, 
                          Item2_second_rater_id, Item2_second_rating)

我需要像这样的长格式数据:

Student_ID  <- c(1:4)
Item_number <- c(1,1,2,2)
Rater_id <- c(1:4)
Score <- c(2,3,4,5)
long <- data.frame(Student_ID, Item_number, Rater_id, Score)

关于如何重塑的任何想法?

感谢。

1 个答案:

答案 0 :(得分:1)

您正在尝试做什么并不完全清楚(换句话说,您想要如何转换源数据)。这是一个猜测,至少可以让你更接近你想要的输出。

似乎“宽”数据集中的names包含三组信息:(1)项目编号,(2)“时间”(第一或第二),以及(3)另一个变量(“评级”或“评价者”)。

我们可以使用meltcolsplitdcast来促进我们的重塑。

第1步:melt数据集

library(reshape2)
orignames <- names(wide) # Store the original names so we can replace them
names(wide) <- gsub("Item([0-9])_(.*)_(rater_id|rating)", 
                    "\\1\\.\\2\\.\\3", names(wide))
# "melt" the dataset
m.wide <- melt(wide, id.vars="Student_ID")
head(m.wide)
#   Student_ID         variable value
# 1          1 1.first.rater_id     1
# 2          2 1.first.rater_id     2
# 3          3 1.first.rater_id     1
# 4          4 1.first.rater_id     2
# 5          1   1.first.rating     2
# 6          2   1.first.rating     3

第2步:使用colsplit

创建新列
m.wide <- cbind(m.wide, 
                colsplit(m.wide$variable, "\\.", 
                         c("Item", "Time", "Var")))
head(m.wide)
#   Student_ID         variable value Item  Time      Var
# 1          1 1.first.rater_id     1    1 first rater_id
# 2          2 1.first.rater_id     2    1 first rater_id
# 3          3 1.first.rater_id     1    1 first rater_id
# 4          4 1.first.rater_id     2    1 first rater_id
# 5          1   1.first.rating     2    1 first   rating
# 6          2   1.first.rating     3    1 first   rating

第3步:使用dcast重塑数据

dcast(m.wide, Student_ID + Item ~ Time + Var, value.var="value")
#   Student_ID Item first_rater_id first_rating second_rater_id second_rating
# 1          1    1              1            2               2             4
# 2          1    2              4            2               6             3
# 3          2    1              2            3               3             5
# 4          2    2              2            3               7             4
# 5          3    1              1            4               2             3
# 6          3    2              5            4               2             5
# 7          4    1              2            2               3             2
# 8          4    2              1            2               3             4

切换左侧的内容以及~右侧的内容会影响数据的“形状”。