【问题标题】:reshape or dcast long to wide with no value.var 2 columns重塑或 dcast 长到宽,没有 value.var 2 列
【发布时间】:2018-10-08 12:26:14
【问题描述】:

我有一个 2 列的 data.frame df,前六行显示在这里,但它有更多的块序列,每个跨越 3 行:

blocksequenceid description
M049-S215-S085 ECDTM-49
M049-S215-S085 ICD-215 
M049-S215-S085 ICD-85
M049-S213-S044 ECDTM-49
M049-S213-S044 ICD-213
M049-S213-S044 ICD-44

我想把它转换成这种格式:

blocksequenceid description1 description2 description3 
M049-S215-S085 ECDTM-49 ICD-215 ICD-85
M049-S213-S044 ECDTM-49 ICD-213 ICD-44

我考虑过 dcast 和 reshape,但是当它显示 ERROR: column time not found for reshape 时我不知道该怎么做,而且我不确定 dcast 是否适合在这里使用。这是我尝试过的:

reshape(df, idvar='blocksequenceid', timevar = 'description', direction = 'wide')
reshape(df, idvar='blocksequenceid', v.names = 'description', direction = 'wide')

我确信这很简单,但我缺少一些东西。

【问题讨论】:

  • 你可以这样使用dcast dcast(blocksequenceid ~ description, data=df, value.var = "description") 但你必须手动设置colnames,也许使用paste0
  • hmm 我之前尝试过,它正在做的是获取每个描述(其中有很多)并为每个描述创建一个新列,然后在每个新列下放置 0。我收到的消息是aggregation function missing: defaulting to length

标签: r group-by rename dplyr spread


【解决方案1】:

这是可重现的数据。

t <- 'blocksequenceid description
M049-S215-S085 ECDTM-49
M049-S215-S085 ICD-215 
M049-S215-S085 ICD-85'

df <- read.table(text = t, header = T)

这是一个可能的解决方案。

library(tidyverse)
df %>% 
  rename(description1 = description) %>%
  mutate(description = row_number()) %>%
  spread(description, description1, sep = "")

#   blocksequenceid description1 description2 description3
# 1  M049-S215-S085     ECDTM-49      ICD-215       ICD-85

编辑修改后的数据

t <- 'blocksequenceid description
M049-S215-S085 ECDTM-49
M049-S215-S085 ICD-215 
M049-S215-S085 ICD-85
M049-S213-S044 ECDTM-49
M049-S213-S044 ICD-213
M049-S213-S044 ICD-44'

df <- read.table(text = t, header = T)

在更新的数据中,你应该先做group_by(blocksequenceid)。

library(tidyverse)
df %>% 
  rename(description1 = description) %>%
  group_by(blocksequenceid) %>%
  mutate(description = row_number()) %>%
  spread(description, description1, sep = "")

# # A tibble: 2 x 4
# # Groups:   blocksequenceid [2]
#   blocksequenceid description1 description2 description3
#   <chr>           <chr>        <chr>        <chr>       
# 1 M049-S213-S044  ECDTM-49     ICD-213      ICD-44      
# 2 M049-S215-S085  ECDTM-49     ICD-215      ICD-85

【讨论】:

  • 我在 rename(., description=description1) 中遇到错误:未使用的参数 (description=description1) 即使我像您的示例一样使用 %>% 管道..
  • 应该是rename(description1 = description),而不是相反。
  • 哦,是的,不,那是我试过的......它仍然给出同样的错误
  • 它试图使用 plyr 的重命名而不是 dplyr .. dplyr::rename() 修复了它。但是现在它找不到 row_number()... 而且我似乎找不到来自的包
  • 你也可以从base R试试as.data.frame(t(unstack(df,description~blocksequenceid)))
猜你喜欢
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
相关资源
最近更新 更多