4

これは、私のデータセット ( MergedData) が R でどのように見えるかの例です。各参加者 (5 行) がすべてのテスト (7 列) でスコア番号を取得しました。すべてのテストを組み合わせた (すべての列) が、参加者ごと (行) の合計スコアを知りたいです。

また、私の完全なデータセットには、これらのいくつかの変数だけではありません。可能であれば、数式とループを使用して、行ごと/列ごとに入力する必要がないようにしたいと思います。

Participant TestScores     
ParticipantA    2   4   2   3   2   3   4
ParticipantB    1   3   2   2   3   3   3
ParticipantC    1   4   4   2   3   4   2
ParticipantD    2   4   2   3   2   4   4
ParticipantE    1   3   2   2   2   2   2

私はこれを試しましたが、うまくいきません:

Test_Scores <- rowSums(MergedData[Test1, Test2, Test3], na.rm=TRUE)

次のエラー メッセージが表示されます。

Error in `[.data.frame`(MergedData, Test1, Test2, Test3,  : 
  unused arguments

これを解決するにはどうすればよいですか?ありがとうございました!!

4

6 に答える 6

12

私はあなたがこれを望んでいると思います:

rowSums(MergedData[,c('Test1', 'Test2', 'Test3')], na.rm=TRUE)
于 2014-05-09T15:24:12.963 に答える
2

あなたが使用することができます:

MergedData$Test_Scores_Sum <- rowSums(MergedData[,2:8], na.rm=TRUE)

2:8合計するすべての列 (テスト) はどこにありますか。このようにして、データに別の列が作成されます。

この方法では、各列名を入力する必要がなく、合計されないデータ フレームに他の列を含めることができます。ただし、合計したいテストのすべての列は、互いに横にある必要があることに注意してください(サンプルデータのように)。

于 2014-05-09T15:29:22.123 に答える
1

?rowSumsおよびのドキュメントを参照してください?colSums

あなたの投稿から正確に何が何でMergedDataあるかは明らかではありません。それが であると仮定するとdata.frame、問題はあなたのインデックス作成MergedData[Test1, Test2, Test3]です。の場合はdata.frame、次のように実行します。

Test_Scores <- rowSums(MergedData, na.rm = TRUE)

また

Test_Scores <- rowSums(MergedData[, c("Test1", "Test2", "Test3")], na.rm = TRUE)

"Test1""Test2"、およびという名前の列のみを使用する"Test3"場合 (実際にそのように名前が付けられている場合)。

これがうまくいかない場合。の出力を見せてくださいstr(MergedData)

本当に役立つ回答を得るには、最小限の再現可能なエラーの例を提供する必要があります。

于 2014-05-09T15:28:31.660 に答える
1

data.frame小さなデータの場合は、 をtablethen useに変換すると面白いかもしれませんaddmargins()

このサンプルデータで

MergedData<-data.frame(Participant=letters[1:5],
    Test1 = c(2,1,1,2,1),
    Test2 = c(4,3,4,4,3),
    Test3 = c(2,2,4,2,2),
    Test4 = c(3,2,2,3,2),
    Test5 = c(2,3,3,2,2)
)

そしてこのヘルパー関数

as.table.data.frame<-function(x, rownames=0) {
    numerics <- sapply(x,is.numeric)
    chars <- which(sapply(x,function(x) is.character(x) || is.factor(x)))
    names <- if(!is.null(rownames)) {
        if (length(rownames)==1) {
            if (rownames ==0) {
                 rownames(x)
            } else {
                as.character(x[,rownames])
            }
        } else {
            rownames
        }
    } else {
          if(length(chars)==1) {
            as.character(x[,chars])
        } else {
            rownames(x)
        }
    }
    x<-as.matrix(x[,numerics])
    rownames(x)<-names
    structure(x, class="table")
}

あなたができる

addmargins(as.table(MergedData))

取得するため

    Test1 Test2 Test3 Test4 Test5 Sum
a       2     4     2     3     2  13
b       1     3     2     2     3  11
c       1     4     4     2     3  14
d       2     4     2     3     2  13
e       1     3     2     2     2  10
Sum     7    18    12    12    12  61

この場合、おそらくあまり便利ではありませんが、addmarginsそれでも楽しい使い方です。

于 2014-05-09T18:38:51.667 に答える
0

dplyrandを使用してそれを行う方法は次のreshape2とおりです。

dat <- read.table(header=T, text = 
                    'Participant Test1 Test2 Test3 Test4 Test5 Test6 Test7     
  ParticipantA    2   4   2   3   2   3   4
  ParticipantB    1   3   2   2   3   3   3
  ParticipantC    1   4   4   2   3   4   2
  ParticipantD    2   4   2   3   2   4   4
  ParticipantE    1   3   2   2   2   2   2')

library(dplyr) 
library(reshape2)    

# Melt data into long format
dat.l = melt(dat, id.var="Participant", variable.name="Test")    
> dat.l
    Participant  Test value
1  ParticipantA Test1     2
2  ParticipantB Test1     1
3  ParticipantC Test1     1
4  ParticipantD Test1     2
...
32 ParticipantB Test7     3
33 ParticipantC Test7     2
34 ParticipantD Test7     4
35 ParticipantE Test7     2

# Sum by Participant
dat.l %.%
  group_by(Participant) %.%
  summarise(Sum=sum(value))

   Participant Sum
1 ParticipantA  20
2 ParticipantB  17
3 ParticipantC  20
4 ParticipantD  21
5 ParticipantE  14

# Sum by Test
dat.l %.%
  group_by(Test) %.%
  summarise(Sum=sum(value))

   Test Sum
1 Test1   7
2 Test2  18
3 Test3  12
4 Test4  12
5 Test5  12
6 Test6  16
7 Test7  15
于 2014-05-09T23:13:52.270 に答える
0

以前の回答が 4 つあり、結果が表示されているのは 1 つだけですか? どうしたの?これが1つです

> dat <- read.table(header=T, text = 
  'Participant Test1 Test2 Test3 Test4 Test5 Test6 Test7     
  ParticipantA    2   4   2   3   2   3   4
  ParticipantB    1   3   2   2   3   3   3
  ParticipantC    1   4   4   2   3   4   2
  ParticipantD    2   4   2   3   2   4   4
  ParticipantE    1   3   2   2   2   2   2')

あなたはそれを書いた

「...可能であれば、数式とループを使用して、行ごと>行/列ごとに入力する必要がないようにしたい」

ループをまったく書く必要はありません。行関数と列関数は、ループなしですべての行とすべての列に対して動作します。

> rowSums(dat[-1], na.rm = TRUE)
## [1] 20 17 20 21 14
> colSums(dat[-1], na.rm = TRUE)
##  Test1  Test2  Test3  Test4  Test5  Test6  Test7 
##      7     18     12     12     12     16     15 
于 2014-05-09T19:26:09.990 に答える