【问题标题】:Reshaping data set in reshape package在 reshape 包中重塑数据集
【发布时间】:2014-11-12 22:11:44
【问题描述】:

我正在尝试使用 Reshape 包重塑我的数据。我努力重塑它。如果您能帮助我,我将不胜感激。

数据如下:

structure(list(ID = 1:3, group = 1:3, v1 = c(1L, 1L, 1L), v2 = c(1L, 1L, 0L), v1.1 = 1:3, v2.1 = c(1L, 1L, 1L), v1.2 = c(1L, 0L, 1L ), v2.2 = c(0L, 1L, 1L), v1.3 = c(1L, 1L, 1L), v2.3 = c(1L, 1L, 1L)), .Names = c("ID", "group", "v1", "v2", "v1.1", "v2.1", "v1.2", "v2.2", "v1.3", "v2.3"), class = "data.frame", row.names = c(NA, -3L))

ID  group      X1              X2              X3          X4   
ID  group   v1  v2  v1  v2  v1  v2  v1  v2
1   1       1   1   1   1   1   0   1   1
2   2   1   1   2   1   0   1   1   1
3   3   1   0   3   1   1   1   1   1

我想要这样的数据。非常感谢您的帮助

ID  group   X   v1  v2
1   1   1   1   1
1   1   2   1   1
1   1   3   1   0
1   1   4   1   1
2   2   1   1   1
2   2   2   2   1
2   2   3   0   1
2   2   4   1   1
3   3   1   1   0
3   3   2   3   1
3   3   3   1   1
3   3   4   1   1

【问题讨论】:

  • 对不起,请忽略顶部表格中的“ID”“组”。顶部是额外的。感谢您的帮助

标签: r reshape


【解决方案1】:

这似乎行得通。

df     <- structure(list(ID = 1:3, group = 1:3, v1 = c(1L, 1L, 1L), v2 = c(1L, 1L, 0L), v1.1 = 1:3, v2.1 = c(1L, 1L, 1L), v1.2 = c(1L, 0L, 1L ), v2.2 = c(0L, 1L, 1L), v1.3 = c(1L, 1L, 1L), v2.3 = c(1L, 1L, 1L)), .Names = c("ID", "group", "v1", "v2", "v1.1", "v2.1", "v1.2", "v2.2", "v1.3", "v2.3"), class = "data.frame", row.names = c(NA, -3L))
result <- reshape(df,idvar=1:2,
                  varying=list(c(3,5,7,9),c(4,6,8,10)),
                  timevar="X",
                  direction="long")
result <- with(result,result[order(ID,group,X),])
result

#       ID group X v1 v2
# 1.1.1  1     1 1  1  1
# 1.1.2  1     1 2  1  1
# 1.1.3  1     1 3  1  0
# 1.1.4  1     1 4  1  1
# 2.2.1  2     2 1  1  1
# 2.2.2  2     2 2  2  1
# 2.2.3  2     2 3  0  1
# 2.2.4  2     2 4  1  1
# 3.3.1  3     3 1  1  0
# 3.3.2  3     3 2  3  1
# 3.3.3  3     3 3  1  1
# 3.3.4  3     3 4  1  1

通常情况下,我会推荐 reshape2 包中的 melt(...),但如果包含一组以上的“值”列(v1v2),这可能会更快。

【讨论】:

  • 非常感谢,jlhoward,我可以在 reshape2 中有代码
  • 在您的问题中发布dput(df) 的结果。
  • 结构(列表(ID = 1:3, group = 1:3, v1 = c(1L, 1L, 1L), v2 = c(1L, 1L, 0L), v1.1 = 1:3, v2.1 = c(1L, 1L, 1L), v1.2 = c(1L, 0L, 1L), v2.2 = c(0L, 1L, 1L), v1.3 = c(1L , 1L, 1L), v2.3 = c(1L, 1L, 1L)), .Names = c("ID", "group", "v1", "v2", "v1.1", "v2. 1”,“v1.2”,“v2.2”,“v1.3”,“v2.3”),class=“data.frame”,row.names = c(NA,-3L))跨度>
  • 代码确实有效。它产生与您的问题相同的结果。
  • +1。这似乎对我有用。不知道 OP 在哪里磕磕绊绊。
【解决方案2】:

你可以试试我的“splitstackshape”包中的merged.stack,你可以这样应用:

library(splitstackshape)
merged.stack(
  df, var.stubs = c("v1", "v2"), 
  sep = "var.stubs")[, .time_1 := NULL][, ind := sequence(.N), 
                                        by = c("ID", "group")][]
#     ID group v1 v2 ind
#  1:  1     1  1  1   1
#  2:  1     1  1  1   2
#  3:  1     1  1  0   3
#  4:  1     1  1  1   4
#  5:  2     2  1  1   1
#  6:  2     2  2  1   2
#  7:  2     2  0  1   3
#  8:  2     2  1  1   4
#  9:  3     3  1  0   1
# 10:  3     3  3  1   2
# 11:  3     3  1  1   3
# 12:  3     3  1  1   4

或者,在同一个包中,有Reshape,它是一个试图简化base R 的reshape() 使用的包装器。但从长远来看,它会比merged.stack 慢。

要使用它,首先将名为“v1”和“v2”的列重命名为“v1.0”和“v2.0”:

setnames(df, c("v1", "v2"), c("v1.0", "v2.0"))
Reshape(df, var.stubs = c("v1", "v2"), sep = ".")
#     ID group time v1 v2
#  1:  1     1    1  1  1
#  2:  2     2    1  1  1
#  3:  3     3    1  1  0
#  4:  1     1    2  1  1
#  5:  2     2    2  2  1
#  6:  3     3    2  3  1
#  7:  1     1    3  1  0
#  8:  2     2    3  0  1
#  9:  3     3    3  1  1
# 10:  1     1    4  1  1
# 11:  2     2    4  1  1
# 12:  3     3    4  1  1

另一种选择(因为您似乎坚持使用“reshape2”解决方案)是首先melt 数据,然后对数据进行一些修改以使其为dcast 做好准备。

这是一种方法(从原始的“df”数据开始,而不是我们重命名上述列的那个):

library(reshape2)
## melt the data
dfL <- melt(df, id.vars = c("ID", "group"))
## replace "v1" and "v2" with "v1.0" and "v2.0"
dfL$variable <- gsub("(v1$|v2$)", "\\1.0", dfL$variable)
## split that column into two parts and bind back with the original df
dfL <- cbind(dfL, colsplit(dfL$variable, "\\.", c("var", "time")))
## reshape from long to wide
dcast(dfL, ID + group + time ~ var, value.var = "value")
#    ID group time v1 v2
# 1   1     1    0  1  1
# 2   1     1    1  1  1
# 3   1     1    2  1  0
# 4   1     1    3  1  1
# 5   2     2    0  1  1
# 6   2     2    1  2  1
# 7   2     2    2  0  1
# 8   2     2    3  1  1
# 9   3     3    0  1  0
# 10  3     3    1  3  1
# 11  3     3    2  1  1
# 12  3     3    3  1  1

如果您想要与问题中显示的完全相同的输出,则必须增加“时间”列。

【讨论】:

    【解决方案3】:

    试试:

    nddf = data.frame(ID=numeric(), group=numeric(), x=numeric(), v1=numeric(), v2=numeric())
    for(i in 1:nrow(ddf)){
        nddf[nrow(nddf)+1,]=c(ddf[i,'ID'], ddf[i,'group'], 1, ddf[i,3], ddf[i,4])
        nddf[nrow(nddf)+1,]=c(ddf[i,'ID'], ddf[i,'group'], 2, ddf[i,5], ddf[i,6])
        nddf[nrow(nddf)+1,]=c(ddf[i,'ID'], ddf[i,'group'], 3, ddf[i,7], ddf[i,8])
        nddf[nrow(nddf)+1,]=c(ddf[i,'ID'], ddf[i,'group'], 4, ddf[i,9], ddf[i,10])
    }
    nddf
       ID group x v1 v2
    1   1     1 1  1  1
    2   1     1 2  1  1
    3   1     1 3  1  0
    4   1     1 4  1  1
    5   2     2 1  1  1
    6   2     2 2  2  1
    7   2     2 3  0  1
    8   2     2 4  1  1
    9   3     3 1  1  0
    10  3     3 2  3  1
    11  3     3 3  1  1
    12  3     3 4  1  1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      • 2013-10-29
      • 2019-10-17
      • 2020-07-29
      • 2018-11-21
      • 1970-01-01
      相关资源
      最近更新 更多