【问题标题】:find what variables changed per value of another variable找出每个变量的值改变了哪些变量
【发布时间】:2011-09-28 18:22:00
【问题描述】:

给定以下data.frame:

t   x   y
---------
1   1   3
1   1   3
1   1   2
2   1   2
2   2   2

我想要表单的输出

t   cnt cux cuy
---------------
1   3   1   2
2   2   2   1

其中cnt是具有特定值t的所有行的计数,cux/cuy是x/y的所有唯一行的计数

另一个限制是答案必须适用于可变数量的列。

谢谢。

【问题讨论】:

  • 我也没有投反对票,但确实考虑过这样做,因为示例与提供的输出不一致。

标签: r reshape melt


【解决方案1】:

您用文字描述的内容与您在预期输出中显示的内容不一致。特别是,根据您的输入计算 y 的唯一值将是 2 和 1,而不是 3 和 2。根据书面说明:

DF <- data.frame(t=c(1,1,1,2,2), x=c(1,1,1,1,2), y=c(3,3,2,2,2))

library("plyr")

ddply(DF, .(t), function(DF) {
    data.frame(cnt=length(DF$t), colwise(function(x) {length(unique(x))})(DF))
})

或者如果你想要一些真正实用的东西:

library("functional")

ddply(DF, .(t), function(DF) {
    data.frame(cnt=length(DF$t), colwise(Compose(unique, length))(DF))
})

或者完全过度使用功能范式:

merge(ddply(DF, .(t), summarise, cnt=length(t)),
    ddply(DF, .(t), colwise(Compose(unique, length))))

这些都没有给出您要求的列名;而不是cux,而是x。但是,之后可以更改它们。

res <-
merge(ddply(DF, .(t), summarise, cnt=length(t)),
    ddply(DF, .(t), colwise(Compose(unique, length))))

names(res)[-(1:2)] <- paste("cu", names(DF)[-1], sep="")

给了

> res
  t cnt cux cuy
1 1   3   1   2
2 2   2   2   1

【讨论】:

  • 太棒了!感谢您的解释。我会写出更好的问题:)
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 2015-12-04
  • 2021-07-25
相关资源
最近更新 更多