变量R之间的转换

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.

我不知道如何计算这样一个表,我正在查看reshape2tidyr文档,但没有成功.


理想情况下,我正在寻找一个reshape类似于cast功能类似的软件包(我无法想到谷歌搜索的关键字...),其中包含以下fun内容my.df:

modern.cast(my.df, .(x.2012, y.2012) ~ .(x.2013, y.2013), fun)
Run Code Online (Sandbox Code Playgroud)

Dav*_*urg 5

可能的解决方案是

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)