3

ここに私のデータがあります:

sub <- paste ("s", 1:6, sep = "")
mark1a <- c("A", "A", "B", "d1", "A", 2)
mark1b <- c("A", "B", "d1", 2, "d1", "A")
myd <- data.frame (sub, mark1a, mark1b)
myd 
     sub mark1a mark1b
1  s1      A      A
2  s2      A      B
3  s3      B     d1
4  s4     d1      2
5  s5      A     d1
6  s6      2      A

変数 (列) のペア (mark1a と mark1b) の計画行列を作成します。計画行列は、各固有 (c(mark1a, mark1b)) の長さ (unique (c(mark1a, mark1b))) で構成されます。次に、特定の数が列に 1 回または 2 回存在するかどうかに基づいて 1 または 2、それ以外の場合は 0 になります。以下は期待される出力です (図ではありません)。

ここに画像の説明を入力

これがどのように行われるかを理解できました:

4

3 に答える 3

3

次のようなことを試すことができます:

cbind(myd, t(apply(myd, 1, function(x) sapply(unique(unlist(myd[, 2:3])), function(y) sum(x==y)))))
1  s1      A      A 2 0  0 0
2  s2      A      B 1 1  0 0
3  s3      B     d1 0 1  1 0
4  s4     d1      2 0 0  1 1
5  s5      A     d1 1 0  1 0
6  s6      2      A 1 0  0 1
于 2012-07-08T17:47:50.283 に答える
3

まず、mark1amark1b列が同じレベルを共有していることを確認します。

all.levels <- levels(myd["mark1a", "mark1b"])
levels(myd$mark1a) <- all.levels
levels(myd$mark1b) <- all.levels

次に、2 つの頻度表の合計を計算し、それを にバインドできますmyd

library(plyr)
cbind(myd, ddply(myd, "sub", function(x)table(x$mark1a) + table(x$mark1b))[,-1])
#   sub mark1a mark1b 2 A B d1
# 1  s1      A      A 0 2 0  0
# 2  s2      A      B 0 1 1  0
# 3  s3      B     d1 0 0 1  1
# 4  s4     d1      2 1 0 0  1
# 5  s5      A     d1 0 1 0  1
# 6  s6      2      A 1 1 0  0
于 2012-07-08T18:37:11.803 に答える
2

@jmsigner からの解決策はワンライナーの方法だと思いますが、通常、ネストされたapply(およびその親戚) 解決策に混乱します。

同様のソリューションを次に示します。

# Identify all the levels in `mark1a` and `mark1b`
mydLevels = unique(c(levels(myd$mark1a), levels(myd$mark1b)))
# Use these levels and an anonymous function with `lapply`
temp = data.frame(lapply(mydLevels, 
                         function(x) rowSums(myd[-1] == x)+0))
colnames(temp) = mydLevels
# This gives you the correct output, but not in the order
# that you have in your original question.
cbind(myd, temp)
#   sub mark1a mark1b 2 A B d1
# 1  s1      A      A 0 2 0  0
# 2  s2      A      B 0 1 1  0
# 3  s3      B     d1 0 0 1  1
# 4  s4     d1      2 1 0 0  1
# 5  s5      A     d1 0 1 0  1
# 6  s6      2      A 1 1 0  0
于 2012-07-08T18:33:45.610 に答える