0

我有一个包含两个变量(数据点)的文本文件 - 第一个变量用于学生 ID,第二个变量包含每个学生 ID 的一组成绩。

格式为 student_id,{grades}

例如:

0,80,1001,65,71,402,99,50,03,904

表示

  student_id=0 has grades{80,100} 
  student_id=2 has grades{65,71,40} and so on.

我想在 R 中得到一个数据框,如下所示

student_id   grades   
0            80,100 
1            65,71,40 
2            99,50,0 
3            90 
4

我尝试使用以下命令将数据加载到 R

x <- read.delim(file, header=TRUE, row.names=NULL)

这就是我最终得到的

    student_id. .grades.
1              0,80,100 
2              1,65,71,40 
3              2,99,50,0 
4              3,90 
5              4

对于如何解决这个问题,我将不胜感激。如果您希望我提供更多信息,请告诉我。谢谢!

4

2 回答 2

1

我不明白你的问题输入到底是什么。但在这里我假设你有这样的东西:

x <- readLines(textConnection(
"student_id   grades   
0            80,100 
1            65,71,40 
2            99,50,0 
3            90 
4"))

然后read.table在替换所有空格后像这样|使用并将其用作常规分隔符:

   res <- read.table(text=gsub('\\s+','|',x),sep='|',header=TRUE,fill=TRUE)

你得到这张表:

  student_id   grades  X
1          0   80,100 NA
2          1 65,71,40 NA
3          2  99,50,0 NA
4          3       90 NA
5          4          NA

当然,像这样删除最后一列很容易:

res[,-ncol(res)]
  student_id   grades
1          0   80,100
2          1 65,71,40
3          2  99,50,0
4          3       90
5          4         
于 2013-07-14T23:40:45.287 回答
0

这有点棘手,因为它是空格和逗号分隔的混合体。我的解决方案有点难看——也许有人会想出更好的办法。

x <- readLines(textConnection(
"student_id   grades   
0            80,100 
1            65,71,40 
2            99,50,0 
3            90 
4"))

padNA <- function(x,maxLen) {
    if ((L <- (maxLen-length(x)))>0) x <- c(x,rep(NA,L))
    x
}
getPos <- function(x,n) if (length(x)>=n) x[[n]] else ""
## separate student IDs
student_id <- sapply(strsplit(x[-1],"\\s+"),getPos,1)
## (convert to numeric if you want)
## separate scores
scores <- sapply(strsplit(x[-1],"\\s+"),getPos,2)
## split scores by comma and pad to max length
scoreMat <- do.call(rbind,lapply(strsplit(scores,","),padNA,5))
## convert from character to numeric
storage.mode(scoreMat) <- "numeric"
## combine
data.frame(student_id,scoreMat)
于 2013-07-14T23:27:23.393 回答