2015-06-19 21 views
0

,我有以下格式的数据插入可变长串的R用一个二维矩阵

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,] < - T(Y):
       数目的要替换的项目不是替换长度的倍数

谁能告诉我如何在这个错误的工作

感谢和问候

+0

的[尺寸不匹配当填充基质]可能重复(http://stackoverflow.com/questions/6916675/dimension-does-not-match-when-populating-matrix) – Armfoot

+0

我将'Course'(在您的原始代码中)更改为'Subject',因为它看起来像一个错字。 – bgoldst

回答

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长度整除的索引分配(实际上,对于普通向量,它只是一个警告,但对于矩阵来说,它似乎是一个错误;无论如何,它可能从来都不是正确的做法)。


一般情况下,如果你确实需要进行这样的不可分的任务,你可以通过附加的NAS 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 
+0

感谢它的工作 – Udit

+0

没有问题 – bgoldst