【问题标题】:Reshaping data matrix in R在R中重塑数据矩阵
【发布时间】:2014-03-12 14:53:38
【问题描述】:

我有一些数据要在 R 中重塑,但不知道如何。这是场景:我有来自不同学校的许多学生的考试成绩数据。以下是一些示例数据:

#Create example data: 
test <- data.frame("score" = c(1,10,20,40,20), "schoolid" = c(1,1,2,2,3))

产生这样的数据格式:

  score schoolid
    1        1
   10        1
   20        2
   40        2
   20        3

因此,有一个学校 ID 可以标识学校,并且每个学生都有一个考试成绩。对于不同程序中的分析,我希望数据格式如下:

                Score student 1    Score student 2 
School ID == 1        1                   10               
School ID == 2       10                   40
School ID == 3       20                   NA

为了重塑数据,我尝试使用 reshape2 库中的 reshape 和 cast 函数,但这导致了错误:

#Reshape function
reshape(test, v.names = test2$score, idvar = test2$schoolid, direction = "wide")
reshape(test, idvar = test$schoolid, direction = "wide")
#Error: in [.data.frame'(data,,idvar): undefined columns selected

#Cast function
cast(test,test$schoolid~test$score)
#Error: Error: could not find function "cast" (although ?cast works fine)

我想,每所学校的考试成绩数量不同,这一事实使重组过程变得复杂。

我如何重塑这些数据以及我应该使用哪个函数?

【问题讨论】:

  • 你必须在data.frame上定义学生ID。

标签: r casting dataframe reshape2


【解决方案1】:

以下是一些仅使用 R 基础的解决方案。所有三个解决方案都使用这个新的studentno 变量:

studentno <- with(test, ave(schoolid, schoolid, FUN = seq_along))

1) 点按

with(test, tapply(score, list(schoolid, studentno), c))

给予:

   1  2
1  1 10
2 20 40
3 20 NA

2) 重塑

# rename score to student and append studentno column
test2 <- transform(test, student = score, score = NULL, studentno = studentno)
reshape(test2, dir = "wide", idvar = "schoolid", timevar = "studentno")

给予:

  schoolid student.1 student.2
1        1         1        10
3        2        20        40
5        3        20        NA

3) xtabs 如果没有分数为 0 的学生,xtabs 也可以使用。

xt <- xtabs(score ~ schoolid + studentno, test)
xt[xt == 0] <- NA  # omit this step if its ok to use 0 in place of NA
xt

给予:

        studentno
schoolid  1  2
       1  1 10
       2 20 40
       3 20   

【讨论】:

    【解决方案2】:

    你必须在某处定义学生ID,例如:

    test <- data.frame("score" = c(1,10,20,40,20), "schoolid" = c(1,1,2,2,3))
    test$studentid <- c(1,2,1,2,1)
    
    library(reshape2)
    dcast(test, schoolid ~ studentid, value.var="score",mean)
      schoolid  1   2
    1        1  1  10
    2        2 20  40
    3        3 20 NaN
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多