【问题标题】:Reshaping datas in a specific form以特定形式重塑数据
【发布时间】:2016-10-08 09:37:22
【问题描述】:

我的数据如下,这是一个但实际上我很少experiment,它是简化数据集:

DF=structure(list(theoric = c("E", "E", "F", "F", "F"), observed = c("E", 
"E", "F", "F", "E"), experiment = c("RO(2)", "RO(2)", "RO(2)", "RO(2)", 
"RO(2)")), .Names = c("theoric", "observed", "experiment"), row.names = 2:6, class = "data.frame")

现在我的数据有以下形式:

  theoric observed  experiment
2       E        E RO(2)
3       E        E RO(2)
4       F        F RO(2)
5       F        F RO(2)
6       F        E RO(2)

我希望它被重新塑造如下:

                  2 3 4 5 6
RO(2) theoric     E E F F F
RO(2) observed    E E F F E

最简单的方法是什么?我真的不知道该怎么做。我试过了

meltR <- melt(DF, id="experiment")

但我失去了theoricobserved 之间的所有通信。非常感谢

编辑:完整数据集:

DF=structure(list(theoric = c("E", "E", "F", "F", "F", "E", "F", 
"F", "F", "F", "F", "E", "E", "E", "E"), observed = c("E", "E", 
"F", "F", "E", "F", "F", "F", "F", "F", "F", "E", "E", "E", "F"
), experiment = c("RO", "RO", "RO", "RO", "RO", "MO", "MO", "MO", 
"MO", "MO", "MO", "EL", "EL", "EL", "EL")), .Names = c("theoric", 
"observed", "experiment"), row.names = c(2L, 3L, 4L, 5L, 6L, 
24L, 25L, 26L, 27L, 28L, 29L, 21L, 22L, 23L, 13L), class = "data.frame")

输出:

    col2 col1.2 col1.3 col1.4 col1.5 col1.6 col1.24 col1.25 col1.26
1   RO theoric      E      E      F      F      F    <NA>    <NA>    <NA>
6   MO theoric   <NA>   <NA>   <NA>   <NA>   <NA>       E       F       F
12  EL theoric   <NA>   <NA>   <NA>   <NA>   <NA>    <NA>    <NA>    <NA>
16 RO observed      E      E      F      F      E    <NA>    <NA>    <NA>
21 MO observed   <NA>   <NA>   <NA>   <NA>   <NA>       F       F       F
27 EL observed   <NA>   <NA>   <NA>   <NA>   <NA>    <NA>    <NA>    <NA>
   col1.27 col1.28 col1.29 col1.21 col1.22 col1.23 col1.13
1     <NA>    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>
6        F       F       F    <NA>    <NA>    <NA>    <NA>
12    <NA>    <NA>    <NA>       E       E       E       E
16    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>
21       F       F       F    <NA>    <NA>    <NA>    <NA>
27    <NA>    <NA>    <NA>       E       E       E       F

编辑 2:添加 EL 输出

RO theoric     E E F F F
RO observed    E E F F E
MO theoric     E F F F F
MO observed    F F F F F
EL theoric     E E E E
EL observed    E E E F

【问题讨论】:

  • 如果您查看新数据集的输入和输出,很明显某些数字仅在特定实验中出现。所以,我不确定你在这里期待什么
  • 在您的编辑中,未显示 EL。所以,我认为这是不正确的输出
  • 你说得对,抱歉。你觉得这样可以吗?
  • 有些值还是不行,你能检查我的更新

标签: r reshape data-munging


【解决方案1】:

根据预期的输出,我们可能需要创建一个带有row.names 的列。通过unlisting 前两列、复制“实验”列和行名列来创建一个新数据集(“df2”)。然后使用base R中的reshape将'long'格式转换为'wide'。

df2 <- data.frame(col1 = unlist(DF[1:2], use.names=FALSE), 
      col2 = paste( rep(DF$experiment, 2),
    rep(colnames(DF)[1:2], each = nrow(DF))), col3 = rep(row.names(DF), 2))

reshape(df2, idvar = "col2", direction="wide", timevar = "col3")
#             col2 col1.2 col1.3 col1.4 col1.5 col1.6
#1  RO(2) theoric      E      E      F      F      F
#6 RO(2) observed      E      E      F      F      E

或者使用来自data.tablemelt/dcast。将 'data.frame' 转换为 'data.table' 保留行名 (setDT(DF, keep.row.names = TRUE)),melt 将其转换为 'long' 格式,paste 'experiment' 和 'variable' 列,然后 @987654331 @ 从“长”到“宽”格式。

library(data.table)
dcast(melt(setDT(DF, keep.rownames = TRUE), id.var = c("rn", "experiment"))[,
    experiment := paste(experiment, variable)], experiment~rn, value.var = "value")
#       experiment 2 3 4 5 6
#1: RO(2) observed E E F F E
#2:  RO(2) theoric E E F F F

更新

使用新的数据集,

library(data.table)#v1.9.7+
dcast(melt(setDT(DF), id.var = "experiment"), paste(experiment, 
    variable)~rowid(experiment, variable), value.var="value", fill="")
#    experiment 1 2 3 4 5 6
#1: EL observed E E E F    
#2:  EL theoric E E E E    
#3: MO observed F F F F F F
#4:  MO theoric E F F F F F
#5: RO observed E E F F E  
#6:  RO theoric E E F F F  

【讨论】:

  • 非常感谢这个完整的答案,它适用于我发布的 DF,但是当我使用我拥有的完整数据集时,它不起作用,为什么?见编辑。谢谢。
  • @ranell 我使用 dcast/melt 测试了第二种解决方案。它确实提供了输出,但唯一的问题是所有组合都不在您的数据中,因此它会为这些元素填充 NA。即“MO”实验只有行号 24:28,同样,其他实验也有同样的问题。
  • Rowid 似乎是 data.table 的功能。它返回我“eval 中的错误(expr,envir,enclos):不可能找到函数“rowid”
  • @ranell 它在开发版本中,即。 1.9.7。如果你使用1.9.6,那么dcast(melt(setDT(DF), id.var = "experiment")[, rid := 1:.N, .(experiment, variable)], paste(experiment, variable)~rid, value.var="value", fill="")
  • 非常感谢您的耐心等待,它现在可以正常工作了:)
【解决方案2】:

您还可以执行以下操作:

require(tidyverse)                                                                                                                                                                                                                  
DF %>% 
  gather(type, val, theoric, observed) %>% 
  unite(experiment, experiment, type, sep=" ") %>% 
  group_by(experiment) %>% 
  mutate(experiment_number = 1:n()) %>% 
  spread(experiment_number, val, fill="")

这给了你:

   experiment   `1`   `2`   `3`   `4`   `5`   `6`
*       <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 EL observed     E     E     E     F            
2  EL theoric     E     E     E     E            
3 MO observed     F     F     F     F     F     F
4  MO theoric     E     F     F     F     F     F
5 RO observed     E     E     F     F     E      
6  RO theoric     E     E     F     F     F      

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多