【问题标题】:Reshaping an untidy data frame重塑凌乱的数据框
【发布时间】:2013-01-10 16:30:09
【问题描述】:

*响应 cmets 进行编辑

我有一个数据集,我正在尝试为分析做准备:

raw<-data.frame(
  name=c("Place 1", "Place 2", "Place 3", "Place 4"),
  x.1.Jan.12=c(1, NA, 0.5, NA),
  Jan.time=c("0900", NA, "0930", NA),
  x.15.Jan.12=c(NA, 0.7, NA, NA),
  Jan.time=c(NA, "1030", NA, NA),
  x.3.Feb.12=c(0.8, 0.6, 0.4, NA),
  Feb.time=c("0715", "0800", "0830", NA),
  x.8.Feb.12=c(NA, NA, 0.65, 0.33),
  Feb.time=c(NA, NA, "?", "1123")
  )

数据应该非常简单:带有结果的位置、结果的日期和收集时间。如您所见,日期已用于命名包含结果的变量。每个“时间”变量都与它之前的列相关 - 第一个“Jan.time”变量是“x.1.Jan.12”中结果的时间

我想将数据重组为四个变量 - namedatetimevalue。 我很确定 reshape2 可以做到这一点并且已经融化了数据:

mDat<-melt(raw, id=c("name"))

无法完成接下来的步骤 - 可能与奇怪的变量名称有关。

我想要的结果是这样的:

outData<-data.frame(
  name=c("Place 1", "Place 2", "Place 3", "Place 4", "Place 1", "Place 2", "Place 3", "Place 4", "Place 1", "Place 2", "Place 3", "Place 4", "Place 1", "Place 2", "Place 3", "Place 4"),
  date=c("1-Jan-12", "1-Jan-12", "1-Jan-12", "1-Jan-12", "15-Jan-12", "15-Jan-12", "15-Jan-12", "15-Jan-12", "3-Feb-12", "3-Feb-12", "3-Feb-12", "3-Feb-12", "8-Feb-12", "8-Feb-12", "8-Feb-12", "8-Feb-12"),
  value=c(1, NA, 0.5, NA, NA, 0.7, NA, NA, 0.8, 0.6, 0.4, NA, NA, NA, 0.65, 0.33),
  time=c("0900", NA, "0930", NA, NA, "1030", NA, NA, "0715", "0800", "0830", NA, NA, NA, "?", "1123")
)

【问题讨论】:

  • 我不完全确定你想要什么输出(也许只是我)。我猜你想要四列 - namedatatimevalue - 但是这些列中应该包含哪些值?您能否发布您希望结果显示的确切方式?
  • 你能解释一下你当前的变量吗?它似乎是成对出现的:一月份的日期,然后是“Jan.time”,不管是什么。但是,为什么 2 月的日期后面还跟着一个“Jan.time”列?正如@MadScone 所建议的那样,发布所需输出的示例也会有所帮助。
  • 正确答案是什么?
  • 感谢您的反馈 - 我已尝试让问题更清晰

标签: r reshape


【解决方案1】:

一种选择是在data.frame 的不同子集上使用“reshape2”中的melt()。可以使用grep() 提取子集。

library(reshape2)
temp <- cbind(
    setNames(melt(raw[c(1, grep("time", names(raw)))], id.vars="name"), 
             c("name", "mon.time", "time")),
    setNames(melt(raw[grep("time", names(raw), invert = TRUE)], id.vars="name"),
             c("name", "date", "result")))
temp[, c("name", "result", "time", "date")]
#       name result time        date
# 1  Place 1   1.00 0900  x.1.Jan.12
# 2  Place 2     NA <NA>  x.1.Jan.12
# 3  Place 3   0.50 0930  x.1.Jan.12
# 4  Place 4     NA <NA>  x.1.Jan.12
# 5  Place 1     NA <NA> x.15.Jan.12
# 6  Place 2   0.70 1030 x.15.Jan.12
# 7  Place 3     NA <NA> x.15.Jan.12
# 8  Place 4     NA <NA> x.15.Jan.12
# 9  Place 1   0.80 0715  x.3.Feb.12
# 10 Place 2   0.60 0800  x.3.Feb.12
# 11 Place 3   0.40 0830  x.3.Feb.12
# 12 Place 4     NA <NA>  x.3.Feb.12
# 13 Place 1     NA <NA>  x.8.Feb.12
# 14 Place 2     NA <NA>  x.8.Feb.12
# 15 Place 3   0.65    ?  x.8.Feb.12
# 16 Place 4   0.33 1123  x.8.Feb.12

【讨论】:

    【解决方案2】:

    新的一天通常会有所帮助。我设法制定了一个非重塑解决方案,但它使用了一个可怕的 for 循环:

    subList<-list()
    for(i in seq(2,8,2)){
      temp<-raw[c(1, i, i+1)]
      temp$date<-rep(names(temp)[2], nrow(temp))
      names(temp)<-c("name", "result", "time", "date")
      subList[[i/2]]<-temp
    }
    
    solution1<-do.call("rbind", subList)
    

    【讨论】:

      猜你喜欢
      • 2020-11-16
      • 2018-02-08
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2018-05-02
      • 2017-10-05
      相关资源
      最近更新 更多