【问题标题】:Reshaping a df in a specific way in R [duplicate]在R中以特定方式重塑df [重复]
【发布时间】:2016-07-12 15:15:31
【问题描述】:

我正在努力将这个 df 重塑成一个不同的,我有这个:

   ID task mean  sd mode
1  0    2   10 1.5  223
2  0    2   21 2.4  213
3  0    2   24 4.3  232
4  1    3   26 2.2  121
5  1    3   29 1.3  433
6  1    3   12 2.3  456
7  2    4   45 4.3  422
8  2    4   67 5.3  443
9  2    4   34 2.1  432

我想以这种方式重塑它,丢弃sdmode 并将means 放在这样的行中:

   ID task mean mean1 mean2
1  0    2   10    21    24
2  1    3   26    29    12
3  2    4   45    67    34

非常感谢您提前提供的帮助

【问题讨论】:

  • 这只是从长到宽的一般重塑,因此是重复的。要摆脱sdmode,您可以先使用<- NULL,也可以不将它们选择到重构的数据框中。

标签: r dataframe reshape


【解决方案1】:

您需要首先创建一个新列,我们可以通过它来旋转mean 值。使用data.table,这种方法有效:

library(data.table)
dt <- data.table(df) # Convert to data.table

dcast(dt[,nr := seq(task),
         .(ID)], 
      ID + task ~ nr,
      value.var = "mean")
#   ID task  1  2  3
#1:  0    2 10 21 24
#2:  1    3 26 29 12
#3:  2    4 45 67 34

因此,您始终可以将列重命名为您希望它们被调用的名称。

【讨论】:

    【解决方案2】:
    reshape(cbind(df,time=ave(df$ID,df$ID,FUN=seq_along)),dir='w',idvar=c('ID','task'),drop=c('sd','mode'),sep='');
    ##   ID task mean1 mean2 mean3
    ## 1  0    2    10    21    24
    ## 4  1    3    26    29    12
    ## 7  2    4    45    67    34
    

    数据

    df <- data.frame(ID=c(0L,0L,0L,1L,1L,1L,2L,2L,2L),task=c(2L,2L,2L,3L,3L,3L,4L,4L,4L),mean=c(
    10L,21L,24L,26L,29L,12L,45L,67L,34L),sd=c(1.5,2.4,4.3,2.2,1.3,2.3,4.3,5.3,2.1),mode=c(223L,
    213L,232L,121L,433L,456L,422L,443L,432L));
    

    【讨论】:

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