【问题标题】:combine different row's values in table in r在r中的表中组合不同行的值
【发布时间】:2015-12-05 20:37:33
【问题描述】:

我需要在 R 中重新格式化表格。

我有一张这样的桌子。

ID  category   
1   a   
1   b   
2   c   
3   d   
4   a   
4   c  
5   a   

我想把它改成

ID  category1   category2  
1           a           b  
2           c        null  
3           d        null  
4           a           c  
5           a        null  

这在 R 中可行吗?

【问题讨论】:

  • 对你如何从 X 到 Y 进行一些解释会很好
  • 下次会这样做:)

标签: r format reformat reformatting


【解决方案1】:

这是一个非常简单的“从长到宽”类型的整形问题,但您需要一个辅助“id”(或“时间”)变量。

您可以尝试使用我的“splitstackshape”包中的getanID 并使用dcast 将形状从长变宽。 getanID 将创建一个名为“.id”的新列,用作您的“时间”变量:

library(splitstackshape)
dcast.data.table(getanID(mydf, "ID"), ID ~ .id, value.var = "category")
#    ID 1  2
# 1:  1 a  b
# 2:  2 c NA
# 3:  3 d NA
# 4:  4 a  c
# 5:  5 a NA

【讨论】:

  • 非常感谢,帮了大忙!
  • 还有你的老基 R 等价物 - reshape(cbind(dat,time=ave(dat$ID,dat$ID,FUN=seq_along)), idvar="ID", direction="wide", times="time")
  • 如果有新的 col 3 我可以使用 dcast.data.table(getanID(mydf, "ID"), ID +col 3 ~ .id, value .var = "类别") 对吗?谢谢
  • @KarlTian,不确定我是否完全遵循您的问题。如果它只是一列,那么是的。如果您尝试分散多个列,则语法会有所不同,并且需要“data.table”的开发版本(或基本 R 的 reshape)。
【解决方案2】:

与 Ananda 相同,但使用 dplyrtidyr

library(tidyr)
library(dplyr)
mydf %>% group_by(ID) %>%
    mutate(cat_row = paste0("category", 1:n())) %>%
    spread(key = cat_row, value = category)

# Source: local data frame [5 x 3]
# 
#   ID category1  category2
# 1  1         a          b
# 2  2         c         NA
# 3  3         d         NA
# 4  4         a          c
# 5  5         a         NA

【讨论】:

  • 谢谢 :) 我试图从 CRAN 下载包“tidyr”,但它一直失败并给我这样的错误 {Warning in install.packages : cannot open: HTTP status is '404未找到'download.file(url,destfile,方法,模式=“wb”,...)中的错误:无法打开URL'cran.rstudio.com/bin/windows/contrib/3.2/tidyr_0.2.0.zip'安装包中的警告:}
  • @KarlTian 这很奇怪,它在 CRAN 上。您可以尝试不同的 CRAN 镜像(尽管 RStudio 的镜像往往是可靠的),或者直接从 github 安装。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2021-03-31
  • 2021-05-23
  • 1970-01-01
相关资源
最近更新 更多