2

这是我的数据:

   name = c(letters[1:10], letters[1:10])
    Yr <- rep(1:2, each = length (name))
    P1 = c(NA, NA,NA, NA, "a", "a", "a", "d", "d", "d", NA, NA,NA,
    NA, "a", "a", "a", "d", "d", "d")
    P2 =  c(NA, NA,NA, NA, "b", "b", "b", "b", "b", "c", 
    NA, NA,NA, NA, "b", "b", "b", "b", "b", "c")
    myd <- data.frame (Yr, name, P1, P2)

对于除 P1 和 P2 之外的所有唯一值,我想创建名为 a 和 b 的新变量,然后在 P1 和 P2 列中对它们的存在或不存在进行评分。就像下面这样:

Yr   name   P1     P2      a     b    c    d
1    a      <NA>   <NA>    NA    NA   NA   NA
1    b      <NA>   <NA>    NA    NA   NA   NA
1    c      <NA>   <NA>    NA    NA   NA   NA
1    d      <NA>   <NA>    NA    NA   NA   NA
1    e      a      b       1     1    0    0
1    f      a      b       1     1    0    0
1    g      a      b       1     1    0    0
1    h      d      b       0     1    0    1
1    i      d      b       0     1    0    1
1    j      d      c       0     0    1    1

(1)新列- 新列是 P1 和 P2 列中的唯一值(缺失值除外)

(2)新列的值- 例如,对于“a”名称(主题)的情况,P1 和 P2 都是 NA。对于“e”,名称 P1 为“a”,P2 为“b”,因此“a”和“b”将得到 1,其他所有内容为 0,同样基于 P1 或 P2 的存在,列a、b、c、d 评分。

完整的预期输出:

Yr  name P1     P2     a    b   c   d
1   a   <NA>    <NA>    NA  NA  NA  NA
1   b   <NA>    <NA>    NA  NA  NA  NA
1   c   <NA>    <NA>    NA  NA  NA  NA
1   d   <NA>    <NA>    NA  NA  NA  NA
1   e   a   b   1   1   0   0
1   f   a   b   1   1   0   0
1   g   a   b   1   1   0   0
1   h   d   b   0   1   0   1
1   i   d   b   0   1   0   1
1   j   d   c   0   0   1   1
1   a   <NA>    <NA>    NA  NA  NA  NA
1   b   <NA>    <NA>    NA  NA  NA  NA
1   c   <NA>    <NA>    NA  NA  NA  NA
1   d   <NA>    <NA>    NA  NA  NA  NA
1   e   a   b   1   1   0   0
1   f   a   b   1   1   0   0
1   g   a   b   1   1   0   0
1   h   d   b   0   1   0   1
1   i   d   b   0   1   0   1
1   j   d   c   0   0   1   1
2   a   <NA>    <NA>    NA  NA  NA  NA
2   b   <NA>    <NA>    NA  NA  NA  NA
2   c   <NA>    <NA>    NA  NA  NA  NA
2   d   <NA>    <NA>    NA  NA  NA  NA
2   e   a   b   1   1   0   0
2   f   a   b   1   1   0   0
2   g   a   b   1   1   0   0
2   h   d   b   0   1   0   1
2   i   d   b   0   1   0   1
2   j   d   c   0   0   1   1
2   a   <NA>    <NA>    NA  NA  NA  NA
2   b   <NA>    <NA>    NA  NA  NA  NA
2   c   <NA>    <NA>    NA  NA  NA  NA
2   d   <NA>    <NA>    NA  NA  NA  NA
2   e   a   b   1   1   0   0
2   f   a   b   1   1   0   0
2   g   a   b   1   1   0   0
2   h   d   b   0   1   0   1
2   i   d   b   0   1   0   1
2   j   d   c   0   0   1   1
4

3 回答 3

3

这是使用双精度merge和的尝试model.matrix

result <- merge(
  merge(myd,model.matrix(~ P1 - 1, data=myd),by="row.names",all.x=TRUE),
  model.matrix(~ P2 - 1, data=myd),
  by.x="Row.names",by.y="row.names",all.x=TRUE
)

# put the data in the 'right' order again and rename the columns
result <- result[order(as.numeric(result$Row.names)),]
names(result)[6:9] <- gsub("P1|P2","",names(result)[6:9])

这给出了这样的最终产品,尽管列名没有完全按照指定的顺序列出。

> result
   Row.names Yr name   P1   P2  a  d  b  c
1          1  1    a <NA> <NA> NA NA NA NA
12         2  1    b <NA> <NA> NA NA NA NA
23         3  1    c <NA> <NA> NA NA NA NA
34         4  1    d <NA> <NA> NA NA NA NA
36         5  1    e    a    b  1  0  1  0
37         6  1    f    a    b  1  0  1  0
38         7  1    g    a    b  1  0  1  0
39         8  1    h    d    b  0  1  1  0
于 2013-03-15T00:50:27.493 回答
2
newcolname <- with(myd,sort(union(levels(P1),levels(P2))))
newcollist <- with(myd,lapply(newcolname,function(x) as.numeric(P1==x|P2==x)))
names(newcollist) <- newcolname
newcoldf <- data.frame(newcollist)
myd <- cbind(myd,newcoldf)
于 2013-03-15T00:15:23.667 回答
2

这是一个data.table解决方案:

require(data.table)
dt <- data.table(myd)
dt[, grp := gl(4, 10)]
dt[, list(a = sum(unique(P1) == "a"), 
          b = sum(unique(P1) == "d"), 
          c = sum(unique(P2) == "b"), 
          d = sum(unique(P2) == "c")), 
by=list(grp, Yr, name)]
#     grp Yr name  a  b  c  d
#  1:   1  1    a NA NA NA NA
#  2:   1  1    b NA NA NA NA
#  3:   1  1    c NA NA NA NA
#  4:   1  1    d NA NA NA NA
#  5:   1  1    e  1  0  1  0
#  6:   1  1    f  1  0  1  0
#  7:   1  1    g  1  0  1  0
#  8:   1  1    h  0  1  1  0
#  9:   1  1    i  0  1  1  0
# 10:   1  1    j  0  1  0  1
# 11:   2  1    a NA NA NA NA
# 12:   2  1    b NA NA NA NA
# 13:   2  1    c NA NA NA NA
# 14:   2  1    d NA NA NA NA
# 15:   2  1    e  1  0  1  0
# 16:   2  1    f  1  0  1  0
# 17:   2  1    g  1  0  1  0
# 18:   2  1    h  0  1  1  0
# 19:   2  1    i  0  1  1  0
# 20:   2  1    j  0  1  0  1
# 21:   3  2    a NA NA NA NA
# 22:   3  2    b NA NA NA NA
# 23:   3  2    c NA NA NA NA
# 24:   3  2    d NA NA NA NA
# 25:   3  2    e  1  0  1  0
# 26:   3  2    f  1  0  1  0
# 27:   3  2    g  1  0  1  0
# 28:   3  2    h  0  1  1  0
# 29:   3  2    i  0  1  1  0
# 30:   3  2    j  0  1  0  1
# 31:   4  2    a NA NA NA NA
# 32:   4  2    b NA NA NA NA
# 33:   4  2    c NA NA NA NA
# 34:   4  2    d NA NA NA NA
# 35:   4  2    e  1  0  1  0
# 36:   4  2    f  1  0  1  0
# 37:   4  2    g  1  0  1  0
# 38:   4  2    h  0  1  1  0
# 39:   4  2    i  0  1  1  0
# 40:   4  2    j  0  1  0  1
#     grp Yr name  a  b  c  d
于 2013-03-15T14:34:15.983 回答