【问题标题】:Casting with more that one value variable R [duplicate]使用多个值变量 R 进行转换 [重复]
【发布时间】:2015-03-21 14:41:38
【问题描述】:

我想从长格式转到宽格式。我的数据看起来像这样:

day=c(1,2,3,4,5,6,1,2,3,4,5,6)
site=c('a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'b')
value.1=c(1,2,5,7,5,3,9,4,2,8,1,8)
value.2=c(5,4,7,6,2,4,6,9,4,2,5,6)
data=data.frame(day,site,value.1,value.2)
> data
   day site value.1 value.2
1    1    a       1       5
2    2    a       2       4
3    3    a       5       7
4    4    a       7       6
5    5    a       5       2
6    6    a       3       4
7    1    b       9       6
8    2    b       4       9
9    3    b       2       4
10   4    b       8       2
11   5    b       1       5
12   6    b       8       6

我想根据站点将其切换为宽格式。所以它看起来像这样

> data
  day a.value.1 a.value.2 b.value.1 b.value.2
1   1         1         5         9         6
2   2         2         4         4         9
3   3         5         7         2         4
4   4         7         6         8         2
5   5         5         2         1         5
6   6         3         4         8         6

我觉得我应该可以使用 reshape 包做到这一点,但我无法弄清楚

我希望得到一些帮助。 谢谢

【问题讨论】:

  • 查看“reshape2”中的recast,等待“data.table”版本1.9.8,这将使dcast.data.table以比@更有效的方式获得您描述的功能987654326@ 会。

标签: r reshape


【解决方案1】:

可以使用tidyrdplyr 包:

library("tidyr")
library("dplyr")
data %>% 
  gather(labs, values, value.1:value.2) %>% 
  unite(site2, site,labs, sep = ".") %>% 
  spread(site2, values) 

虽然我必须承认没有太多理由这样做,但reshape 工作得很好。我只是喜欢tidyrdplyr

【讨论】:

    【解决方案2】:

    是的,这可以使用“reshape”包来完成:

    library(reshape)
    
    # Melt the data to obtain the 'value' labels
    dM <- melt(data, id.vars=c('day', 'site'))
    
    # Now concatenate the site and 'value' labels
    dM$siteVal <- paste(dM$site, dM$variable, sep=".")
    
    # Cast the data using site-value labels
    dSite <- cast(dM, day ~ siteVal)
    

    【讨论】:

      【解决方案3】:

      您在使用 dcast 时遇到了问题,因为您的数据不是很长,它已经是部分宽了。如果您将melt 转换为更长的格式,dcast 可以正常工作:

      > data.long = melt(data, id = c("day", "site"))
      > head(data.long)
        day site variable value
      1   1    a  value.1     1
      2   2    a  value.1     2
      3   3    a  value.1     5
      4   4    a  value.1     7
      5   5    a  value.1     5
      6   6    a  value.1     3
      > dcast(data.long, day ~ site + variable)
        day a_value.1 a_value.2 b_value.1 b_value.2
      1   1         1         5         9         6
      2   2         2         4         4         9
      3   3         5         7         2         4
      4   4         7         6         8         2
      5   5         5         2         1         5
      6   6         3         4         8         6
      

      【讨论】:

      • 我的真实数据更长...这只是一个示例
      • 我不是在谈论行数,而是在谈论长格式和宽格式。你有两列值,但真正的“长”数据只有一个值列——这是dcast 假设的起点。
      【解决方案4】:

      您可以在base R 中执行此操作

      reshape(data, idvar='day', timevar='site',direction='wide')
      #    day value.1.a value.2.a value.1.b value.2.b
      #1   1         1         5         9         6
      #2   2         2         4         4         9
      #3   3         5         7         2         4
      #4   4         7         6         8         2
      #5   5         5         2         1         5
      #6   6         3         4         8         6
      

      【讨论】:

        猜你喜欢
        • 2010-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-22
        • 1970-01-01
        • 2020-03-25
        • 2022-01-20
        • 1970-01-01
        相关资源
        最近更新 更多