2

我的reshape()功能有些问题。例如,一旦我重塑了形状,它就会将我所有的变量名更改为“value.var 1”。

我用来重塑的代码是:

test<- reshape(cdc_city, idvar= "site", timevar="variable", 
               direction="wide", new.row.names=FALSE)

我猜我使用错误的“new.row.names=FALSE”部分。我曾尝试用 FALSE 代替 NULL,但这也没有用。

我的目标是按如下方式转换数据集:

site    variable    value
site 1  var 1       4
site 1  var 2       7
site 1  var 3       2
site 1  var 4       6
site 1  var 5       3
site 2  var 1       89
site 2  var 2       43
site 2  var 3       12
site 2  var 4       54
site 2  var 5       23
site 3  var 1       76
site 3  var 2       62
site 3  var 3       13
site 3  var 4       43
site 3  var 5       23

进入这样的数据集:

site    var 1    var 2    var 3    var 4    var 5
1       4        7        2        6        3
2       89       43       12       54       23
3       76       62       13       43       23

如果有人知道如何摆脱“价值”。出现在我的变量名的开头,那太好了!或者,如果有更好的代码我可以使用,我也对此非常开放。

谢谢,

提摩太

4

3 回答 3

4

对于这样的重塑,xtabs也很有用:

xtabs(value ~ site + variable, data = cdc_city)
#         variable
# site     var 1 var 2 var 3 var 4 var 5
#   site 1     4     7     2     6     3
#   site 2    89    43    12    54    23
#   site 3    76    62    13    43    23

不过,关于您的问题,我实际上并不认为这是一个“问题”。这正是它应该如何工作的。

考虑以下场景。您的另一列data.frame(我们将其称为“其他”)并且您想要将整个数据集从长到宽重塑。

这是一些示例数据和输出:

set.seed(1)
cdc_city$other = sample(1:20, 15, replace=TRUE)
reshape(cdc_city, direction="wide", 
        idvar="site", timevar="variable")
#      site value.var 1 other.var 1 value.var 2 other.var 2 value.var 3
# 1  site 1           4           6           7           8           2
# 6  site 2          89          18          43          19          12
# 11 site 3          76           5          62           4          13
#    other.var 3 value.var 4 other.var 4 value.var 5 other.var 5
# 1           12           6          19           3           5
# 6           14          54          13          23           2
# 11          14          43           8          23          16

看来,在这种情况下,添加valueother变量名是必不可少的。

最后,您的new.row.names论点在这里毫无用处,因为您对列名而不是行名感到不满。

更新

由于我有心情分享替代方案,您可能也有兴趣探索aggregate,它的语法也相当容易理解:

aggregate(list(var = cdc_city$value), 
          list(site = cdc_city$site), c)
#     site var.1 var.2 var.3 var.4 var.5
# 1 site 1     4     7     2     6     3
# 2 site 2    89    43    12    54    23
# 3 site 3    76    62    13    43    23

如果您使用aggregate,您还可以对结果变量的名称进行一些控制。

于 2012-08-13T16:05:53.083 回答
2

我建议你改用这个包——它比内置的更reshape2容易使用:meltdcastreshape()

library(reshape2)
dcast(cdc_city, site~variable, mean)
    site var 1 var 2 var 3 var 4 var 5
1 site 1     4     7     2     6     3
2 site 2    89    43    12    54    23
3 site 3    76    62    13    43    23
于 2012-08-13T14:55:47.047 回答
1

是的,这可以通过内置的base::reshape().

对于direction=="wide",您可以使用带有参数的列表来重命名重新整形的变量varying。正如您所发现的,reshape 将生成一个看起来像`v.name`.`times`. R 文档错误地建议接受varying名称向量(它确实适用于direction=="long")。

cdc_city <- data.frame(
    site=paste("site", rep(1:3, each=5)),
    variable=paste("var", rep(1:5, 3)), 
    value=c(4,7,2,6,3,89,43,12,54,23,76,62,13,43,23))

#       site variable value
#  1  site 1    var 1     4
#  2  site 1    var 2     7
#  3  site 1    var 3     2
#  4  site 1    var 4     6
#  5  site 1    var 5     3
#  6  site 2    var 1    89
#  7  site 2    var 2    43
#  8  site 2    var 3    12
#  9  site 2    var 4    54
#  10 site 2    var 5    23
#  11 site 3    var 1    76
#  12 site 3    var 2    62
#  13 site 3    var 3    13
#  14 site 3    var 4    43
#  15 site 3    var 5    23

test <- reshape(cdc_city,
    varying=list(c("var 1", "var 2", "var 3", "var 4", "var 5")),
    idvar= "site", timevar="variable", direction="wide")

#       site var 1 var 2 var 3 var 4 var 5
#  1  site 1     4     7     2     6     3
#  6  site 2    89    43    12    54    23
#  11 site 3    76    62    13    43    23

请注意字符串是因素的 data.frames。您可以varying直接使用 data.frame 中的一个因子指定

reshape( ..., varying=list(as.character(unique(cdc_city$variable))), ...)
于 2016-11-30T23:52:20.503 回答