【发布时间】:2017-01-17 17:01:02
【问题描述】:
我想根据“前导”变量来分隔变量。 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
我不知何故觉得这可以通过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
但这可能只是对dcast的完全滥用。这个问题有没有优雅的解决方案,无需拆分和合并df?
编辑: 有人提到这样做是一个可怕的想法,我可能不应该这样做。让我详细说明什么时候这才有意义。
想象x3 是一个特定算法的开关。在这种情况下,a 和 b 是选项。此外,x1 和 x2 是两种算法都可以采用的参数。不幸的是,这两种算法在 x1 和 x2 的相同参数设置上的行为确实不同,因此将它们作为不同的特征来处理以考虑它们的不相关性是有意义的。
【问题讨论】:
-
嗯,有
merge(df[df$x3=="a",], df[df$x3=="b",], by="x3", all=TRUE),但自然不会有优雅的方式来获得如此混乱的输出。 -
@agenis 现在已修复。
-
@Frank 如果我现在不知道
x3的离散值,这会变得很混乱。 -
只有一句话:如果您想要更多“关注”,您可能应该将问题的标题改进为更具体;下次可能会节省赏金! ;-)
-
行列顺序重要吗?