0

2 つの変数 (データ ポイント) を含むテキスト ファイルがあります。最初の変数は学生 ID 用で、2 番目の変数には各学生 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 に答える