【发布时间】:2016-12-12 19:28:42
【问题描述】:
在将数据从宽数据转换为长数据(反之亦然)方面存在许多资源。这里有一点转折,但如果我错过了任何现有答案,请告诉我。
不同之处在于我有一些由多个标志(虚拟变量)指示的行。我不仅需要从宽到长,还需要同时制作具有多个标志的行的副本。此外,虽然还有其他杂项数据,但没有唯一的 ID,因此没有“timevar”或“idvar”。
例子:
ds <- data.frame(other_data=c(1,2,3),flag_a = c(1,0,0), flag_b=c(0,1,0), flag_c=c(1,0,1))
ds
other_data flag_a flag_b flag_c 1 1 1 0 1 2 2 0 1 0 3 3 0 0 1
desired_result <- data.frame(other_data=c(1,1,2,3), flag=c("a", "c","b","c"))
desired_result
other_data flag 1 1 a 2 1 c 3 2 b 4 3 c
【问题讨论】:
-
我认为 other_data 可以用作 id var..?
library(data.table); melt(setDT(ds), id = "other_data", variable.factor = FALSE)[value == 1, .(other_data, substr(variable, nchar(variable), nchar(variable)))] -
@Frank 在真实数据集中,其他数据就像 40 列非常不明确的数据,例如数百行的 4 个水平因子。那还能用吗?
-
我可能预料到的唯一问题是,您将临时拥有一个包含所有这些零的行的对象,这可能会占用内存。不过,只有数百行和 40 个标志,我想它会没事的。顺便说一句,没有单独发布,因为它只是 MrFlick 答案的一个(不是很好的)变体。
标签: r