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,具体取决于特定数字是否在列中出现一次或两次,否则为 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

然后您可以计算两个频率表的总和并将其绑定到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 回答