【问题标题】:Inserting Variable length row in R for a 2D matrix在 R 中为 2D 矩阵插入可变长度行
【发布时间】:2015-06-19 19:09:57
【问题描述】:

我有以下格式的数据

Reg_No     Subject
  AA11     Physics
  AA11   Chemistry
  AA12     English
  AA12       Maths
  AA12     Physics

我正在尝试将这些数据按行转换

Physics   Chemistry
English       Maths   Physics

我知道每个学生最多可以选修 8 门科目

我正在尝试创建一个矩阵,可以将上述数据存储为可变行(每个学生有不同数量的科目)

我写了以下代码

# read csv file
Term4 <- read.csv("Term4.csv")
# Find number of Students
Matrix_length <- length(unique(Term4$Reg_No))
# Uniquely store their reg number
Student <- unique(Term4$Reg_No)
# create matrix to be inserted as csv
out <- matrix(NA, nrow=Matrix_length , ncol=8) # max subjects = 8 so ncol =8
# iterate to get each reg number's subjects
for (n in 1:Matrix_length) {
    y <- Term4[Term4[,"Reg_No"] == Student[n],]$Subject
    # transpose Courses as a single column into row and insert it in the matrix
    out[n,] <- t(y)
}

我收到以下错误

输出错误 [n, ] 要替换的项目数不是替换长度的倍数

谁能告诉我如何解决这个错误

感谢和问候

【问题讨论】:

标签: r matrix transpose insertion


【解决方案1】:

reshape() 可以这样做:

df <- data.frame(Reg_No=c('AA11','AA11','AA12','AA12','AA12'), Subject=c('Physics','Chemistry','English','Maths','Physics') );
reshape(transform(df,time=ave(c(Reg_No),Reg_No,FUN=seq_along)),dir='w',idvar='Reg_No');
##   Reg_No Subject.1 Subject.2 Subject.3
## 1   AA11   Physics Chemistry      <NA>
## 3   AA12   English     Maths   Physics

这将生成一个 data.frame,其中包含涵盖所有主题所需的尽可能多的列。

您的代码失败的原因是您已经为矩阵预先分配了 8 列,但每个作业的 RHS 将仅包含当前学生 n 在原始 data.frame 中的科目数。 R 拒绝目标长度不能被 RHS 长度整除的索引分配(实际上对于普通向量,这只是一个警告,但对于矩阵,它似乎是一个错误;无论如何,这可能永远不是正确的做法)。


一般来说,如果您确实需要执行这种不可分割的分配,您可以通过附加 NA 将 RHS 扩展到足够的长度来实现。这可以通过rep()c() 完成,但实际上有一种优雅而简单的方法可以使用越界索引来完成。这是一个演示:

m <- matrix(NA_character_,2,8);
m;
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
## [1,] NA   NA   NA   NA   NA   NA   NA   NA
## [2,] NA   NA   NA   NA   NA   NA   NA   NA
m[1,] <- letters[1:3]; ## fails; indivisible
## Error in m[1, ] <- letters[1:3] :
##   number of items to replace is not a multiple of replacement length
m[2,] <- letters[1:3][1:ncol(m)]; ## works
m;
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
## [1,] NA   NA   NA   NA   NA   NA   NA   NA
## [2,] "a"  "b"  "c"  NA   NA   NA   NA   NA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多