9

私が持っているもの:

次の列を持つ「マスター」データフレームがあります。

userid, condition

4つの実験条件があるため、回答情報を保持する4つのデータフレームがあり、次の列があります。

userid, condition, answer1, answer2

今、私はこれらに参加したいので、ユーザーID、条件、およびこれらの条件に対するそれらの回答のすべての組み合わせがマージされます。各条件には、行ごとの適切な列にのみ正解が含まれている必要があります。


短い、自己完結型の例:

master = data.frame(userid=c("foo","foo","foo","foo","bar","bar","bar","bar"), condition=c("A","B","C","D","A","B","C","D"))
cond_a = data.frame(userid=c("foo","bar"), condition="A", answer1=c("1","1"), answer2=c("2","2"))
cond_b = data.frame(userid=c("foo","bar"), condition="B", answer1=c("3","3"), answer2=c("4","4"))
cond_c = data.frame(userid=c("foo","bar"), condition="C", answer1=c("5","5"), answer2=c("6","6"))
cond_d = data.frame(userid=c("foo","bar"), condition="D", answer1=c("7","7"), answer2=c("8","8"))

すべての条件をマスターにマージして、マスターテーブルを次のようにするにはどうすればよいですか?

  userid condition answer1 answer2
1    bar         A       1       2
2    bar         B       3       4
3    bar         C       5       6
4    bar         D       7       8
5    foo         A       1       2
6    foo         B       3       4
7    foo         C       5       6
8    foo         D       7       8

私は次のことを試しました:

temp = merge(master, cond_a, all.x=TRUE)

それは私に与えます:

  userid condition answer1 answer2
1    bar         A       1       2
2    bar         B    <NA>    <NA>
3    bar         C    <NA>    <NA>
4    bar         D    <NA>    <NA>
5    foo         A       1       2
6    foo         B    <NA>    <NA>
7    foo         C    <NA>    <NA>
8    foo         D    <NA>    <NA>

しかし、私がこれを行うとすぐに…</ p>

merge(temp, cond_b, all.x=TRUE)

条件の値はありませんB。どうして?

  userid condition answer1 answer2
1    bar         A       1       2
2    bar         B    <NA>    <NA>
3    bar         C    <NA>    <NA>
4    bar         D    <NA>    <NA>
5    foo         A       1       2
6    foo         B    <NA>    <NA>
7    foo         C    <NA>    <NA>
8    foo         D    <NA>    <NA>
4

3 に答える 3

12

次のようにReduce()使用できます。complete.cases()

merged <- Reduce(function(x, y) merge(x, y, all=TRUE), 
                 list(master, cond_a, cond_b, cond_c, cond_d))
merged[complete.cases(merged), ]
#    userid condition answer1 answer2
# 1     bar         A       1       2
# 2     bar         B       3       4
# 4     bar         C       5       6
# 6     bar         D       7       8
# 8     foo         A       1       2
# 9     foo         B       3       4
# 11    foo         C       5       6
# 13    foo         D       7       8

Reduce()慣れるのに少し時間がかかるかもしれません。関数を定義してlistから、関数を繰り返し適用するオブジェクトを提供します。したがって、そのステートメントは次のようになります。

temp1 <- merge(master, cond_a, all=TRUE)
temp2 <- merge(temp1, cond_b, all=TRUE)
temp3 <- merge(temp2, ....)

または次のようなもの:

merge(merge(merge(master, cond_a, all=TRUE), cond_b, all=TRUE), cond_c, all=TRUE)

complete.cases()指定された列が「完全」であるかどうかの論理ベクトルを作成します。この論理ベクトルは、マージされたからサブセット化するために使用できますdata.frame

于 2012-12-08T14:29:41.710 に答える
2

OPが述べているように、マスターデータフレームとの明示的な関係がない場合、オプションは次のとおりです。

temp <-rbind(cond_a,cond_b,cond_c,cond_d)
temp[order(temp["userid"]),]

おそらく、何らかの関係がわかっていれば、単純ではない解決策がある可能性があります。

于 2012-12-08T14:51:41.377 に答える
1

この結合をSQLステートメントとして表現し、sqldfライブラリを使用して実行できます。

cond_all = rbind(cond_a, cond_b, cond_c, cond_d)

> sqldf('select p.userid as userid, p.condition as condition, answer1, answer2 from master as p join cond_all as q on p.userid=q.userid and p.condition=q.condition order by userid, condition')
  userid condition answer1 answer2
1    bar         A       1       2
2    bar         B       3       4
3    bar         C       5       6
4    bar         D       7       8
5    foo         A       1       2
6    foo         B       3       4
7    foo         C       5       6
8    foo         D       7       8

コメントで、マスターデータフレームには、condデータフレームには存在しない余分な列があると述べました。この場合でも機能するように、このSQLクエリを変更できるはずです。

于 2012-12-09T21:03:40.527 に答える