2016-10-01 15 views
2

私はアンケートデータを含むデータテーブルを持っているので、最初の列は、参加者IDとそれに続く各アンケートの列とそれに続く別々の質問です。例えば、データテーブルがAが1回のアンケートで、Bは異なるものである場合には、次のようになります。mutate_atとsum関数を使用して特定の列で行の値を合計しますか?

ID A1 A2 A3 B1 B2 
1 3 5 3 4 2 
2 2 5 2 2 1 
3 4 1 3 4 1 
4 3 2 3 3 2 

私はdplyr機能を使用して、これをコーディングすることにしたいです。私はdplyrのmutate_atを使用して、それぞれのアンケートの要約を見つけるのに問題があります。それぞれについてはIDです。質問用紙AA1A2、およびA3)の合計とB ...のようなものを探したいと思います。

data %>% 
    group_by(ID) %>% 
    mutate_at(vars(contains("A")), funs(sum)) %>% 
    ungroup() 

は、しかし、常にこれを実行している私に

のエラーを与える:しかし、私のデータテーブルは、その中の多くのアンケートを( ABCD .....など)ので、私のコードは、今のように見えています

Error: invalid 'type' (character) of argument

と私はなぜ理解できません。私がmutate_eachを試してみると、同じことが起こります。これをどうすれば解決できますか?

答えて

1

私は次のように考えています。 mutate_atを使用してワイドフォーマットのデータをどのように使いたいか分かりますが、ここで長いフォーマットを選択することができます。それはあなたの人生を楽にします。 meltまたはgatherを使用して、長い形式のデータをフォーマットすることができます。次に、列を変更する場合はvariableとします。あなたは数字を削除したい。最後に、データをIDvariableでグループ化し、合計を取得します。

melt(mydf, id.var = "ID") %>% 
mutate(variable = gsub(pattern = "[0-9]+", replacement = "", x = variable)) %>% 
group_by(ID, variable) %>% 
summarise(total = sum(value)) 

#  ID variable total 
# <int> <chr> <int> 
#1  1  A 11 
#2  1  B  6 
#3  2  A  9 
#4  2  B  3 
#5  3  A  8 
#6  3  B  5 
#7  4  A  8 
#8  4  B  5 

DATA

mydf <- structure(list(ID = 1:4, A1 = c(3L, 2L, 4L, 3L), A2 = c(5L, 5L, 
1L, 2L), A3 = c(3L, 2L, 3L, 3L), B1 = c(4L, 2L, 4L, 3L), B2 = c(2L, 
1L, 1L, 2L)), .Names = c("ID", "A1", "A2", "A3", "B1", "B2"), class = "data.frame", row.names = c(NA, 
-4L)) 
+0

gsubは何を説明できますか?またsum(value)の値はどこから来ますか?... – dizzle

+0

'gsub'では数値を削除しています。例えば、A1はAになります。プロセスを視覚化したい場合は、この 'melt(mydf、id.var =" ID ")%>%mutate(variable = gsub(pattern =" [0-9 ] + "、置換=" "、x =変数))'。同様に、 'melt(mydf、id.var =" ID ")'だけを実行することをお勧めします。次に、 'variable'と' value'がどこから来たのかを見ることができます。 reshape2パッケージとdplyrパッケージが必要であることを思い出してください。 – jazzurro

+0

@dizzleコードがうまく機能しましたか? – jazzurro

1

それを行うことは困難だ理由は、明示的にアンケートの種類や数をコード化していないと、データがゆえ、「整頓」ではないということです。 Jazzurroのアプローチは正しいですが、ここではgatherseparateでこれを行うにはtidyrパッケージを使用しました。

library(tidyr) 
library(dplyr) 

data %>% 
gather(test, tot, A1:B2) %>% 
separate(test, into=c("Q", "No"), sep=1) %>% 
group_by(ID, Q) %>% summarise(totals=sum(tot)) 

これにより、gsubなどを使用する必要がなくなります。

また、別の列にAとBを追加する場合は、%>% spread(Q, totals)をパイプラインの末尾に追加できます。

関連する問題