【问题标题】:Reshaping data column into rows using the package of tidyr and/or reshape in R使用 tidyr 和/或 R 中的 reshape 包将数据列重塑为行
【发布时间】:2020-07-29 20:17:51
【问题描述】:

我想将最后一列(在当前数据集中)移动到缺少数据的行(在所需数据集中)。我浏览了 reshape、reshape2 和 tidyr 的软件包。 tidyr 包中的函数gather() 应该是解决方案,但到目前为止我无法处理它。对此有什么建议吗? 提前致谢。

当前数据集:

  date       citycode cityname       cases deaths cases_03_04
1 01-04-2020        1 city1            197      3         241
2 01-04-2020        2 city2             26      0          32

所需数据集:

  date       citycode cityname       cases deaths
1 01-04-2020        1 city1            197      3         
2 01-04-2020        2 city2             26      0          
3 03-04-2020        1 city1            241     na
4 03-04-2020        2 city2             32     na

【问题讨论】:

  • 你本质上想rbind。但是,日期是怎么来的?
  • @NelsonGon 一点也不。 currDataSet的最后一列从cases_03_04分布到desDataSet中的行到cases中。

标签: r dataframe dataset reshape tidyr


【解决方案1】:

data.table 解决方案。

library(data.table)
dt <- fread('date citycode cityname cases deaths cases_03_04
01-04-2020 1 city1 197 3 241
01-04-2020  2 city2 26 0 32')


wdt <- dcast(dt,...~date,value.var = "cases")

wdt
#>    citycode cityname deaths cases_03_04 01-04-2020
#> 1:        1    city1      3         241        197
#> 2:        2    city2      0          32         26
setnames(wdt,old = "cases_03_04",new = "03-04-2020")

ldt <- melt(wdt,measure.vars = patterns("2020$"),variable.name = "date",value.name = "cases")

ldt[date=="03-04-2020",deaths:=NA][]
#>    citycode cityname deaths       date cases
#> 1:        1    city1     NA 03-04-2020   241
#> 2:        2    city2     NA 03-04-2020    32
#> 3:        1    city1      3 01-04-2020   197
#> 4:        2    city2      0 01-04-2020    26

tidyr解决方案

library(dplyr)
library(tidyr)
library(data.table)

dt <- fread('date citycode cityname cases deaths cases_03_04
01-04-2020 1 city1 197 3 241
01-04-2020  2 city2 26 0 32')

df <- tibble(dt)

wdf <- pivot_wider(df,names_from = date,values_from =  cases)

names(wdf) <- c("citycode", "cityname", "deaths", "03-04-2020", "01-04-2020")

wdf
#> # A tibble: 2 x 5
#>   citycode cityname deaths `03-04-2020` `01-04-2020`
#>      <int> <chr>     <int>        <int>        <int>
#> 1        1 city1         3          241          197
#> 2        2 city2         0           32           26

ldf <- pivot_longer(wdf,cols =c("03-04-2020", "01-04-2020"),names_to = "date",values_to = "cases")

ldf %>% 
  mutate(deaths=ifelse(date=="03-04-2020",NA,deaths))
#> # A tibble: 4 x 5
#>   citycode cityname deaths date       cases
#>      <int> <chr>     <int> <chr>      <int>
#> 1        1 city1        NA 03-04-2020   241
#> 2        1 city1         3 01-04-2020   197
#> 3        2 city2        NA 03-04-2020    32
#> 4        2 city2         0 01-04-2020    26

reprex package (v0.3.0) 于 2020-04-17 创建

【讨论】:

  • 感谢您的回复弗兰克。但是,我无法在我这边复制您的答案。它给我带来了各种错误。特别是在融化函数行之后,错误在模式(“2020$”):找不到函数“模式”另外:警告消息:在融化(wdt,measure.vars = patterns(“2020$”),变量。 name = "date", : data.table 中的 melt 泛型已传递一个 data.frame 并将尝试重定向到相关的 reshape2 方法;请注意 reshape2 已弃用,此重定向现在也已弃用。继续使用 reshape2 中的 melt 方法,而 ...
  • 我意识到我必须将我的数据集转换为 data.table 类才能使用 data.table::melt。这对我来说一点也不舒服:( 仍然看起来很整洁或重塑 asnwer。顺便感谢您的努力。
  • @ozturkib 更新 tidyr 解决方案。逻辑是一样的……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-22
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
  • 2012-02-09
相关资源
最近更新 更多