以奇怪的方式应用dcast

jak*_*b-r 2 r reshape2 dcast

我想根据"引导"变量分离变量.x3在以下情况中:

set.seed(2)
df = data.frame(x1 = sample(4), x2 = sample(4), x3 = sample(letters[1:2], size = 4, replace = TRUE))
df
#   x1 x2 x3
# 1  1  4  a
# 2  3  3  b
# 3  2  1  b
# 4  4  2  a

# Desired output
# x3 x1.a x2.a x1.b x2.b
#  a    1    4   NA   NA
#  b   NA   NA    3    3
#  b   NA   NA    2    1
#  a    4    2   NA   NA
Run Code Online (Sandbox Code Playgroud)

我在某种程度上意识到这可以实现,reshape2::dcast()但我只能让它共同工作两个变量:

reshape2::dcast(df[,2:3], seq_along(x3) ~ x3, value.var = "x2")[, -1]
#    a  b
# 1  2 NA
# 2 NA  1
# 3 NA  3
# 4  4 NA
Run Code Online (Sandbox Code Playgroud)

但可能这只是一个完全滥用dcast.是否有一个优雅的解决方案,没有拆分和合并df


编辑:有人提到这样做是一个可怕的想法,我可能不应该做这样的事情.让我详细说明何时可以理解.

想象一下,x3是一个特定算法的开关.在这种情况下a,b是选项.此外x1,x2它们都是算法可以采用的参数.不幸的是,两种算法在相同的参数设置上表现得非常不同x1,x2因此有必要将它们作为不同的特征来处理,以便将它们的无关性考虑在内.

age*_*nis 5

这是一个使用虚拟交互项创建的解决方案X3.通过使用dplyr或者可以将所有这些代码整合到一行中是可能的,data.table但是在这里它是:

temp <- model.matrix( ~ (x1+x2):x3-1, df)
temp[model.matrix( ~ (I(x1+1)+I(x2+1)):x3-1, df) == temp] <- NA
data.frame(df$x3, temp)
####  df.x3 x1.x3a x1.x3b x3a.x2 x3b.x2
####      a      1     NA      4     NA
####      b     NA      3     NA      3
####      b     NA      2     NA      1
####      a      4     NA      2     NA
Run Code Online (Sandbox Code Playgroud)

列的最终名称和顺序与您略有不同.

注意 :(第二行代码的目的).该model.matrix函数创建零代替NAs,所以没有办法告诉与预先存在的零的差异.第二行是仅查找最终NAs的技巧(它通过创建第二个模型矩阵,同时通过改变其值来工作+1).