30個のcsvファイル(それぞれ1つの質問)から複数の選択肢の質問のスコアを取得し、それらを組み合わせて学生のグループにするにはどうすればよいですか?(Rを使用)

パイナップル

学生は、ズームポーリングを使用して、多肢選択問題(MCQ)でテストされています。クラスには40人の生徒がいて、30人のMCQがいます。ポーリングがどのように機能するかはよくわかりませんが、コースの教授は、Zoomが30個のExcelcsvファイル(MCQごとに1つ)を生成すると言いました。各ファイルには、学生の名前、ID、およびMCQ回答の1ポイントまたは0ポイントが含まれます。

私の仕事は、これらの30個のcsvファイル(フォルダーに保存している)をすべて取得し、それらをマージして各学生の合計スコアを見つける方法を見つけることです。だから、「ケイトは30点満点でどれくらい得点したの?」と言えるはずです。

各csvファイル(MCQ1、MCQ2、...という名前になります)は次のようになります。

Name   SID   Score
Kate   534     1
Bret   411     0
Jade   325     1

Rを使用してこれを行う必要があります。これが必要なものです。

Name   SID    MCQ1  MCQ2  MCQ3  MCQ4  MCQ5  ...  Total
Kate   534     1     1      0     1    0    ...  (=sum) 
Bret   411     0     0      0     1    1    ...  (=sum)
Jade   325     1     0      1     1    0    ...  (=sum)

何が起こるために必要なのはRは、「名前」または「SID」とだけスタック使用して、各学生のためMCQスコアを見つける必要があるのスコアに次々と。

私はここSOで以下の投稿を見てきました。

  1. Rのファイル名で複数のExcelファイルをインポートする
  2. 複数の(Excel)ファイルをRに読み込むにはどうすればよいですか?[複製]
  3. 複数の.csvファイルを一度にインポートするにはどうすればよいですか?

これが私がこれまでに持っているものです:

total_score <- list.files(pattern = "*.csv") %>% map_df(read_csv)

Name   SID   Score
Kate   534     1
Bret   411     0
Jade   325     1
Kate   534     1
Bret   411     0
Jade   325     0
Kate   534     0
Bret   411     0
Jade   325     1
Kate   534     1
Bret   411     1
Jade   325     1
Kate   534     0
Bret   411     1
Jade   325     0

最初の2つの列を繰り返さず、特定の学生ごとにファイルから各「スコア」列のみを取得し、それらをcsvファイルにちなんで名付けられた新しい列として配置するようにRに指示するにはどうすればよいですか。誰かが私を正しい方向に向けることができますか?

akrun

でファイル名を抽出して「スコア」列の名前をファイル名に変更basenameし、「ファイル」をループしてデータを読み取りread_csv、「スコア」の名前をファイル名(「nm1」)に変更reduceして、次の方法で単一のデータセットに変更できます。データセットby「名前」、「SID」を結合し、rowSums「MCQ」で始まる列を実行して「合計」列を作成します。

library(readr)
library(dplyr)
library(purrr)
files <- list.files(pattern = "*.csv")
nm1 <- tools::file_path_sans_ext(basename(files))
imap(setNames(files, nm1), 
        ~ {
          nm <- .y
          read_csv(.x) %>%
                  rename_at(vars(Score), ~ nm)
    }) %>%
   reduce(full_join, by = c('Name', 'SID')) %>%
   mutate(Total = rowSums(select(., starts_with('MCQ'))))

-出力

# A tibble: 3 x 8
#  Name    SID  MCQ1  MCQ2  MCQ3  MCQ4  MCQ5 Total
#  <chr> <int> <int> <int> <int> <int> <int> <int>
#1 Bret    411     0     0     0     1     1     2
#2 Jade    325     1     0     1     1     0     3
#3 Kate    534     1     1     0     1     0     3

またはオプション data.table

library(data.table)
Reduce(function(x, y) x[y, on = .(Name, SID)], 
  Map(function(x, y) setnames(fread(x), 'Score', y),
       files, nm1))[, Total := rowSums(.SD, na.rm = TRUE), 
             .SDcols = patterns("^MCQ")][]

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ