这是我的数据:
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
答案 0 :(得分: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
答案 1 :(得分: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)
答案 2 :(得分: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