1

Ciao、これは再現可能な例です。

   df <- data.frame("STUDENT"=c(1,2,3,4,5),
                     "TEST1A"=c(NA,5,5,6,7),
                     "TEST2A"=c(NA,8,4,6,9),
                     "TEST3A"=c(NA,10,5,4,6),
                     "TEST1B"=c(5,6,7,4,1),
                     "TEST2B"=c(10,10,9,3,1),
                     "TEST3B"=c(0,5,6,9,NA),
                     "TEST1TOTAL"=c(NA,23,14,16,22),
                     "TEST2TOTAL"=c(10,16,15,12,NA))

STUDENT から TEST3B までの列があり、TEST1TOTAL TEST2TOTAL を作成したいと考えています。TEST1TOTAL=TEST1A+TEST2A+TEST3A など、TEST2TOTAL についても同様です。TEST1A TEST2A TEST3A に欠落スコアがある場合、TEST1TOTAL は NA です。

ここに私の試みがありますが、コーディング行が少ない解決策はありますか? ここでは、テスト A から O まであるため、この行を何度も書き出す必要があるためです。

TEST1TOTAL=rowSums(df[,c('TEST1A', 'TEST2A', 'TEST3A')], na.rm=TRUE)
4

3 に答える 3

2

R基本関数のみを使用:

output <- data.frame(df1, do.call(cbind, lapply(c("A$", "B$"), function(x) rowSums(df1[, grep(x, names(df1))]))))

列名のカスタマイズ:

> colnames(output)[(ncol(output)-1):ncol(output)] <- c("TEST1TOTAL", "TEST2TOTAL")
> output
  STUDENT TEST1A TEST2A TEST3A TEST1B TEST2B TEST3B TEST1TOTAL TEST2TOTAL
1       1     NA     NA     NA      5     10      0         NA         15
2       2      5      8     10      6     10      5         23         21
3       3      5      4      5      7      9      6         14         22
4       4      6      6      4      4      3      9         16         16
5       5      7      9      6      1      1     NA         22         NA
于 2018-09-18T16:54:23.613 に答える