[英]Reshape data from long to wide, with time in new wide variable name
我有一個數據框,我想從長格式到寬格式合並,但我希望將時間嵌入到寬格式的變量名稱中。 以下是長格式的示例數據集:
id <- as.numeric(rep(1,16))
time <- rep(c(5,10,15,20), 4)
varname <- c(rep("var1",4), rep("var2", 4), rep("var3", 4), rep("var4", 4))
value <- rnorm(16)
tmpdata <- as.data.frame(cbind(id, time, varname, value))
> tmpdata
id time varname value
1 5 var1 0.713888426169224
1 10 var1 1.71483653545922
1 15 var1 -1.51992072577836
1 20 var1 0.556992407683219
....
4 20 var4 1.03752019932467
我想以寬泛的格式使用以下輸出:
id var1.5 var1.10 var1.15 var1.20 ....
1 0.71 1.71 -1.51 0.55
(and so on)
我嘗試在基礎R中使用reshape函數但沒有成功,我不知道如何使用reshape包實現這一點,因為所有示例都將時間作為寬格式的另一個變量。 有任何想法嗎?
重塑包裝這是微不足道的:
library(reshape)
cast(tmpdata, ... ~ varname + time)
我必須在兩個reshape
步驟中完成它。 行標題可能不是您所需的,但可以輕松重命名。
id <- as.numeric(rep(1, 16))
time <- rep(c(5,10,15,20), 4)
varname <- c(rep("var1",4), rep("var2", 4), rep("var3", 4), rep("var4", 4))
value <- rnorm(16)
tmpdata <- as.data.frame(cbind(id, time, varname, value))
first <- reshape(tmpdata, timevar="time", idvar=c("id", "varname"), direction="wide")
second <- reshape(first, timevar="varname", idvar="id", direction="wide")
並輸出:
> tmpdata
id time varname value
1 1 5 var1 -0.231227494628982
2 1 10 var1 -1.80887236653438
3 1 15 var1 -0.443229294431553
4 1 20 var1 1.33719337048763
5 1 5 var2 0.673109282347586
6 1 10 var2 -0.42142267953938
7 1 15 var2 0.874367622725874
8 1 20 var2 -1.19917678039462
9 1 5 var3 1.13495606258399
10 1 10 var3 -0.0779385346672042
11 1 15 var3 -0.126775240288037
12 1 20 var3 -0.760739300144526
13 1 5 var4 -1.94626587907069
14 1 10 var4 1.25643195699455
15 1 15 var4 -0.50986941213717
16 1 20 var4 -1.01324846239812
> first
id varname value.5 value.10 value.15
1 1 var1 -0.231227494628982 -1.80887236653438 -0.443229294431553
5 1 var2 0.673109282347586 -0.42142267953938 0.874367622725874
9 1 var3 1.13495606258399 -0.0779385346672042 -0.126775240288037
13 1 var4 -1.94626587907069 1.25643195699455 -0.50986941213717
value.20
1 1.33719337048763
5 -1.19917678039462
9 -0.760739300144526
13 -1.01324846239812
> second
id value.5.var1 value.10.var1 value.15.var1 value.20.var1
1 1 -0.231227494628982 -1.80887236653438 -0.443229294431553 1.33719337048763
value.5.var2 value.10.var2 value.15.var2 value.20.var2
1 0.673109282347586 -0.42142267953938 0.874367622725874 -1.19917678039462
value.5.var3 value.10.var3 value.15.var3 value.20.var3
1 1.13495606258399 -0.0779385346672042 -0.126775240288037 -0.760739300144526
value.5.var4 value.10.var4 value.15.var4 value.20.var4
1 -1.94626587907069 1.25643195699455 -0.50986941213717 -1.01324846239812
兩年前我放棄了舊的reshape()命令(不是哈德利)。 看起來每次該死的東西實際上比僅僅采用“硬”方式更難,這更加靈活。
您的示例中的數據都已很好地排序。 您可能必須先按var名稱和時間對實際數據進行排序。
(將您的tmpdata重命名為tmp,使值為數字)
y <- lapply(split(tmp, tmp$id), function(x) x$value)
df <- data.frame(unique(tmp$id,), do.call(rbind,y))
names(df) <- c('id', as.character(tmp$time:tmp$var))
為什么不在重塑之前將varname和time粘貼在一起?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.