【问题标题】:Transition between variables R变量 R 之间的转换
【发布时间】:2015-07-21 16:57:40
【问题描述】:

我想计算变量之间转换的摘要。我的数据集看起来像:

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

而我想找一个转换表:

        x.2013 y.2013
x.2012       1      1
y.2012       2      0

因此,它计算 x 的值变化量,因此第二年 yy 的变化为零,y -> x 的变化为 2。

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


理想情况下,我正在寻找像reshape 这样的包(我想不出用于谷歌搜索的关键字...),它具有类似于cast 功能,fun 采用@ 的子集987654334@:

modern.cast(my.df, .(x.2012, y.2012) ~ .(x.2013, y.2013), fun)

【问题讨论】:

  • 您有什么想法可以解决这个问题吗?
  • @Roland 我可以使用循环手动计算,但这不是一个好方法,也不是一个有效的解决方案。
  • 我的意思是我们更愿意看到一些努力。现在稍微好一点了。但是显示for 循环也很好。将其转换为 Rcpp 可能很简单,这将使其非常高效。

标签: r reshape reshape2 tidyr


【解决方案1】:

可能的解决方案是

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

替代方法是使用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

【讨论】:

  • 它适用于具有更多变量的数据集,但您能否添加更多关于它为何有效的信息?我不明白为什么需要res data.frame...
  • 哪个解决方案你不明白,第一个还是第二个? data.frame 的原因是因为dcast 只接受data.frames。
  • 我的意思是apply
  • apply 只是检查每行的哪些列不等于 0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 2021-09-01
  • 1970-01-01
  • 2015-05-29
相关资源
最近更新 更多