我有一个非常大的数据集,其中包含每周的权重,这些权重已经用学习周和该次访问的权重进行了编码。缺少一些访问,数据当前未对齐。
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
我希望能对此有所帮助,甚至找到一个起点来将这些数据处理为易于管理的格式。
答案 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