如何防止reshape()更改变量名称

时间:2012-08-13 14:38:26

标签: r reshape

我在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

如果有人知道如何摆脱“价值”。出现在我的变量名称的开头,这将是伟大的!或者,如果有更好的代码我可以使用,我也非常开放。

谢谢,

蒂莫西

3 个答案:

答案 0 :(得分: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,您还可以某些控制结果变量的名称。

答案 1 :(得分: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

答案 2 :(得分:1)

是的,可以使用内置base::reshape()

来完成

对于direction=="wide",您可以使用带有varying参数的列表重命名重新整形的变量。如您所见,reshape will generate a column name看起来像`v.name`.`times`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 )。

varying

注意字符串是因素的data.frames。您可以使用

直接从data.frame中的因子指定reshape( ..., varying=list(as.character(unique(cdc_city$variable))), ...)
SELECT COUNT (DISTINCT uid) from (SELECT DISTINCT uid  from nodes  UNION SELECT  DISTINCT uid from ways) as subq ;