说我有
dta <- data.frame(
id_1=as.integer(runif(1000,0,20) * 20),
id_2=as.integer(runif(1000,0,5) * 5),
X=LETTERS[as.integer(cut(runif(5),0:3/3))]
)
我想用三列A,B,C替换X.如果在dta中为id_1和id_2的特定组合观察到具有与新表名对应的值的X,则这些列的值将为TRUE ,否则为FALSE。作为一个非常简单的例子:
id_1 = {1, 1, 3}
id_2 = {1, 1, 2}
X = {A, B, A}
会变成:
id_1 = {1, 3}
id_2 = {1, 2}
A = {TRUE, TRUE}
B = {TRUE, FALSE}
C = {FALSE, FALSE}
我认为这是一种重塑操作,但不能想到如何使用常用功能来实现。
我认为以下工作: 使用dplyr:
dta %>%
distinct %>%
mutate(y=1) %>%
spread(X, y, fill=FALSE)
然而,每行的总和仅为“1”,因此需要一些额外的合并
答案 0 :(得分:1)
以下是基础R解决方案:
aggregate(X~id_1+id_2,dta,table)
答案 1 :(得分:1)
另一种解决方案:
library(reshape2)
dcast(dta, id_1+id_2~X, value.var='X',
fun.aggregate= function(x) as.logical(length(x)))