【问题标题】:reshape: cast oddity重塑:铸造古怪
【发布时间】:2010-09-30 06:50:29
【问题描述】:

要么太晚了,要么我发现了一个错误,或者演员不喜欢带有“。”的列名。在他们中。这一切都发生在函数内部,但它在函数外部“不起作用”,就像在函数内部不起作用一样。

x <- structure(list(df.q6 = structure(c(1L, 1L, 1L, 11L, 11L, 9L, 
4L, 11L, 1L, 1L, 2L, 2L, 11L, 5L, 4L, 9L, 4L, 4L, 1L, 9L, 4L, 
10L, 1L, 11L, 9L), .Label = c("a", "b", "c", "d", "e", "f", "g", 
"h", "i", "j", "k"), class = "factor"), df.s5 = structure(c(4L, 
4L, 1L, 2L, 4L, 4L, 4L, 3L, 4L, 1L, 2L, 1L, 2L, 4L, 1L, 3L, 4L, 
2L, 2L, 4L, 4L, 4L, 2L, 2L, 1L), .Label = c("a", "b", "c", "d", 
"e"), class = "factor")), .Names = c("df.q6", "df.s5"), row.names = c(NA, 
25L), class = "data.frame")

cast(x, df.q6 + df.s5 ~., length)

没用。

但是,如果:

colnames(x) <- c("variable", "value")
cast(x, variable + value ~., length)

像魅力一样工作。

【问题讨论】:

  • 在 R 2.11.1 (W7)、reshape_0.8.3 和 plyr_1.2.1 上的行为相同。

标签: r


【解决方案1】:

对我来说,我使用与 Spacedman 指出的类似的解决方案。

#take your data.frame x with it's two columns

#add a column
x$value <- 1

#apply your cast verbatim
cast(x, df.q6 + df.s5 ~., length)

   df.q6 df.s5 (all)
1      a     a     2
2      a     b     2
3      a     d     3
4      b     a     1
5      b     b     1
6      d     a     1
7      d     b     1
8      d     d     3
9      e     d     1
10     i     a     1
11     i     c     1
12     i     d     2
13     j     d     1
14     k     b     3
15     k     c     1
16     k     d     1

希望对您有所帮助!

【讨论】:

  • 本质上它需要“一些东西”来计算,即应用 length() 到。因为它是为 melt() 输出设置的,所以变量名“value”有效,但我认为还有什么其他的吗?剩下的变量被认为是“值”变量?
  • 也在 plyr 中,可能是这样的? ddply(x, .(df.q6, df.s5), summarise, count=length(df.q6))
【解决方案2】:

与列名中的点无关(很容易显示!)。

如果您的数据框没有名为“值”的列,则 cast() 会猜测值是哪一列 - 在这种情况下,它会猜测“df.s5”,因为它是最后一列。这是你在 melt() 数据时得到的。然后在调用 reshape1 之前将该列重命名为“值”。现在“df.s5”列不再存在,但它在公式的左侧。哦哦。

您正在使用公式中的值,这是一件奇怪的事情。没有一个演员表这样做。你想在这里做什么?

您可以添加一个临时列作为虚拟值:

> cast(cbind(x,1), df.q6+s5~., length)

使用 1 作为值列。使用 value 参数进行强制转换以覆盖此选择

   df.q6 s5 (all)
1      a  a     2
2      a  b     2
3      a  d     3
4      b  a     1
5      b  b     1
[etc]

但我怀疑有更好的方法来获取数据框中重复观察(行)的数量 - 这是你真正的问题!

【讨论】:

  • 以这种方式投射数据可以很容易地制作这样的图表:stackoverflow.com/questions/2578961/…
  • 您是否针对链接到的主题中的问题构建了完整的解决方案? stackoverflow.com/questions/2578961/
  • 没有机会浏览它,想知道您是否想要为图表添加标签?
  • 不需要贴标机,fill=""只需要这个
【解决方案3】:

如果您正在寻找简单的解决方案,reshape2 包中的 dcast 可以帮助您:

library(reshape2)
dcast(x, df.q6 + df.s5 ~., length)

【讨论】:

  • 感谢 reshape2 的提醒。
猜你喜欢
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 2019-07-07
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多