重复的步骤杂乱无章,需要帮助进行整理

时间:2018-09-18 01:17:48

标签: r

我有一个非常大的数据集,其中包含每周的权重,这些权重已经用学习周和该次访问的权重进行了编码。缺少一些访问,数据当前未对齐。

View

我想按星期数对齐数据(下面的理想输出)。

df <- data.frame(ID=1:3, Week_A=c(6,6,7), Weight_A=c(23,24,23), Week_B=c(7,7,8), 
                 Weight_B=c(25,26,27), Week_C=c(8,9,9), Weight_C=c(27,26,28)) 

df
  ID Week_A Weight_A Week_B Weight_B Week_C Weight_C
1  1      6       23      7       25      8       27
2  2      6       24      7       26      9       26
3  3      7       23      8       27      9       28

我希望能对此有所帮助,甚至找到一个起点来将这些数据处理为易于管理的格式。

4 个答案:

答案 0 :(得分:2)

tidyverse解决方案:

data

我个人会继续使用df_long而不是df_wide,因为它是function数据帧,而df_wide不是。

答案 1 :(得分:1)

这是使用data.table软件包的一种可能的方法

library(data.table)
#convert into a data.table
setDT(df)

#convert into a long format
mdat <- melt(df, id.vars="ID", measure.vars=patterns("^Week", "^Weight", cols=names(df)))

#pivot into desired output
ans <- dcast(mdat, ID ~ value1, value.var="value2")

ans输出:

   ID  6  7  8  9
1:  1 23 25 27 NA
2:  2 24 26 NA 26
3:  3 NA 23 27 28

如果您确实需要在列名中使用“ Week_”,则可以使用

setnames(ans, names(ans)[-1L], paste("Week_", names(ans)[-1L]))

答案 2 :(得分:1)

另一种tidyverse解决方案,使用双gather和最终spread

df %>%
    gather(k, v, -ID, -starts_with("Weight")) %>%
    separate(k, into = c("k1", "k2")) %>%
    unite(k1, k1, v) %>%
    gather(k, v, starts_with("Weight")) %>%
    separate(k, into = c("k3", "k4")) %>%
    filter(k2 == k4) %>%
    select(-k2, -k3, -k4) %>%
    spread(k1, v)
#  ID Week_6 Week_7 Week_8 Week_9
#1  1     23     25     27     NA
#2  2     24     26     NA     26
#3  3     NA     23     27     28

答案 3 :(得分:0)

在基数R中,它是一个双reshape,首先在不同的变量上变长,然后变宽:

tmp <- reshape(df, idvar="ID", varying=lapply(c("Week_","Weight_"), grep, names(df)),
               v.names=c("time","Week"), direction="long")
reshape(tmp, idvar="ID", direction="wide", sep="_")

#    ID Week_6 Week_7 Week_8 Week_9
#1.1  1     23     25     27     NA
#2.1  2     24     26     NA     26
#3.1  3     NA     23     27     28