m0n*_*awk 4 r reshape reshape2 tidyr
我想计算变量之间转换的摘要.我有一个看起来像这样的数据集:
id x.2012 y.2012 x.2013 y.2013
1 1 0 0 1
2 0 1 1 0
3 0 1 1 0
4 1 0 1 0
Run Code Online (Sandbox Code Playgroud)
我想找到一个转换表:
x.2013 y.2013
x.2012 1 1
y.2012 2 0
Run Code Online (Sandbox Code Playgroud)
因此,它计算了多少值的变化x,因此对于下一年的变化为0 y,y对于下一年变为2 y -> x.
我不知道如何计算这样一个表,我正在查看reshape2和tidyr文档,但没有成功.
理想情况下,我正在寻找一个reshape类似于cast功能类似的软件包(我无法想到谷歌搜索的关键字...),其中包含以下fun内容my.df:
modern.cast(my.df, .(x.2012, y.2012) ~ .(x.2013, y.2013), fun)
Run Code Online (Sandbox Code Playgroud)
可能的解决方案是
res <- data.frame(t(apply(df[-1], 1, function(x) names(df[-1])[x != 0])))
library(reshape2)
dcast(res, X1 ~ X2)
# X1 x.2013 y.2013
# 1 x.2012 1 1
# 2 y.2012 2 0
Run Code Online (Sandbox Code Playgroud)
将使用替代方法which(可能更有效)
indx <- which(df[-1] != 0, arr.ind = TRUE)
res <- data.frame(matrix(names(df)[-1][indx[order(indx[, 1]), 2]], ncol = 2, byrow = TRUE))
dcast(res, X1 ~ X2)
# X1 x.2013 y.2013
# 1 x.2012 1 1
# 2 y.2012 2 0
Run Code Online (Sandbox Code Playgroud)