【问题标题】:How to prevent reshape() from changing variable names如何防止 reshape() 改变变量名
【发布时间】:2012-08-13 14:38:26
【问题描述】:

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

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

谢谢,

提摩太

【问题讨论】:

  • 我编辑了您的问题,因为您使用的是基本 R reshape 函数 - 而不是 reshape 包。
  • 基本 R 函数 reshapenotoriosuly difficult to use。我建议你改用 CRAN 上的 reshape2 包。
  • 感谢您的编辑。将看看 reshape2 包。那将使用“melt”和“cast”命令的组合呢?将尝试解决如何做到这一点

标签: r reshape


【解决方案1】:

对于像这样的重塑,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,您还可以部分控制结果变量的名称。

【讨论】:

  • 是的,这并不是一个真正的“问题”,因为这就是它的工作方式,但对于我正在做的事情来说,这并不是我想要它做的事情。我知道在 stata 中有一些代码可以用来编辑变量名的前缀,这样我就可以删除所有的“值”。在变量名的开头。这更多的是美学问题,并且在以后构建模型时更容易,这样我就不必输入“值”。每次我引用一个变量时。不过我现在会看看 xtabs..
  • @TimothyAlston,另一种选择(如果您正在使用已转换的表并且只需要修复变量名)是使用类似 names(cdc_city) = gsub("value.", "", names(cdc_city)) 的东西。
【解决方案2】:

我建议您改用reshape2 包 - 使用meltdcast 比使用内置的reshape() 更容易:

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

【讨论】:

  • 谢谢,效果很好。然而,它改变了我的变量的顺序。我的实际数据集大约有 70 个,现在似乎以随机方式重新排序。有没有办法阻止这种情况,或者这是不应该发生的事情?
  • @TimothyAlston 请提供展示此行为的可重现示例(在此问题或新问题中)。答案可能涉及按您想要的顺序定义变量的因子水平。
  • 它似乎按字母顺序排列了我的变量。这很好,我仍然可以轻松地使用它,并且比找到解决方法更容易。感谢您的帮助!
  • @Andrie,为什么在你的例子中是mean?另外,我不认为基础 R reshape 很难使用。我看到的主要问题(这也是它的优势)是它是一个用于双向重塑的单一函数,并且您使用的参数根据您要去的方向而有所不同。出于这个原因,我很欣赏Ari 尝试为它创建一个更“优雅”的 ;-) 包装器。
  • @mrdwab 习惯,我猜 - 在这种情况下,可能不需要聚合函数。至于reshape() 的易用性——我真的 尝试过使用它。它非常快速、非常强大且非常灵活。但是要理解在哪些情况下使用哪些参数是完全不可理解的。 reshape 的设计考虑了面板数据这一事实并没有让它变得更容易,当然,除非你有面板数据:-)
【解决方案3】:

是的,这可以通过内置的base::reshape() 来完成。

对于direction=="wide",您可以使用带有varying 参数的列表来重命名重新整形的变量。正如您所发现的,reshape will generate a column name 看起来像 `v.name`.`times`R documentation erroneously suggests 表示 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。您可以直接使用 data.frame 中的一个因子指定varying

reshape( ..., varying=list(as.character(unique(cdc_city$variable))), ...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-17
    • 2017-09-10
    • 2017-04-06
    • 1970-01-01
    • 2012-06-03
    • 2012-04-10
    • 1970-01-01
    • 2011-10-06
    相关资源
    最近更新 更多