我想根据"引导"变量分离变量.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因此有必要将它们作为不同的特征来处理,以便将它们的无关性考虑在内.
这是一个使用虚拟交互项创建的解决方案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).
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |