在R中格式化数据帧
我有一个相当复杂的任务,我需要执行,所以请容忍我。我猜这是可能的,但如果不可能,请告诉我 假设我有以下数据在R中格式化数据帧,r,melt,R,Melt,我有一个相当复杂的任务,我需要执行,所以请容忍我。我猜这是可能的,但如果不可能,请告诉我 假设我有以下数据 set.seed(123) date1 <- c(seq(as.Date("2011-11-1"),as.Date("2012-1-1"),by = "months"),seq(as.Date("2011-12-1"),as.Date("2012-3-1"),by = "months")) date2 <- c(seq(as.Date("2011-12-1"),as.Date(
set.seed(123)
date1 <- c(seq(as.Date("2011-11-1"),as.Date("2012-1-1"),by = "months"),seq(as.Date("2011-12-1"),as.Date("2012-3-1"),by = "months"))
date2 <- c(seq(as.Date("2011-12-1"),as.Date("2012-1-1"),by = "months"),seq(as.Date("2011-11-1"),as.Date("2012-1-1"),by = "months"))
variables <- c(rep("Number of Coins",3),rep("Number of Shoes",4),rep("Number of Coins",2),rep("Number of Shoes",3))
date <- c(date1,date2)
names <- c(rep("Jim",7),rep("Arnold",5))
value <- rnorm(12)
df <- data.frame(names, date, variables, value)
names date variables value
1 Jim 2011-11-01 Number of Coins -0.56047565
2 Jim 2011-12-01 Number of Coins -0.23017749
3 Jim 2012-01-01 Number of Coins 1.55870831
4 Jim 2011-12-01 Number of Shoes 0.07050839
5 Jim 2012-01-01 Number of Shoes 0.12928774
6 Jim 2012-02-01 Number of Shoes 1.71506499
7 Jim 2012-03-01 Number of Shoes 0.46091621
8 Arnold 2011-12-01 Number of Coins -1.26506123
9 Arnold 2012-01-01 Number of Coins -0.68685285
10 Arnold 2011-11-01 Number of Shoes -0.44566197
11 Arnold 2011-12-01 Number of Shoes 1.22408180
12 Arnold 2012-01-01 Number of Shoes 0.35981383
因此,日期范围将是每个变量的最小日期到每个变量的最大日期。这将产生对NAs的需求。我想在每个
名称中执行此操作。希望这有意义 正如@Ajinkya Kale建议的那样,您可以使用reformae2
包处理此任务
dcast(df, names + date ~ variables, value.var = "value")
arrange(dcast(df, names + date ~ variables, value.var = "value"), names, date)
# names date Number of Coins Number of Shoes
#1 Arnold 2011-11-01 NA -0.44566197
#2 Arnold 2011-12-01 -1.2650612 1.22408180
#3 Arnold 2012-01-01 -0.6868529 0.35981383
#4 Jim 2011-11-01 -0.5604756 NA
#5 Jim 2011-12-01 -0.2301775 0.07050839
#6 Jim 2012-01-01 1.5587083 0.12928774
#7 Jim 2012-02-01 NA 1.71506499
#8 Jim 2012-03-01 NA 0.46091621
如果要确保日期顺序是按时间顺序排列的,可以在dplyr
包中使用arrange()
dcast(df, names + date ~ variables, value.var = "value")
arrange(dcast(df, names + date ~ variables, value.var = "value"), names, date)
# names date Number of Coins Number of Shoes
#1 Arnold 2011-11-01 NA -0.44566197
#2 Arnold 2011-12-01 -1.2650612 1.22408180
#3 Arnold 2012-01-01 -0.6868529 0.35981383
#4 Jim 2011-11-01 -0.5604756 NA
#5 Jim 2011-12-01 -0.2301775 0.07050839
#6 Jim 2012-01-01 1.5587083 0.12928774
#7 Jim 2012-02-01 NA 1.71506499
#8 Jim 2012-03-01 NA 0.46091621
另一种选择是使用tidyr
library(tidyr)
spread(df, variables, value)
# names date Number of Coins Number of Shoes
#1 Arnold 2011-11-01 NA -0.44566197
#2 Arnold 2011-12-01 -1.2650612 1.22408180
#3 Arnold 2012-01-01 -0.6868529 0.35981383
#4 Jim 2011-11-01 -0.5604756 NA
#5 Jim 2011-12-01 -0.2301775 0.07050839
#6 Jim 2012-01-01 1.5587083 0.12928774
#7 Jim 2012-02-01 NA 1.71506499
#8 Jim 2012-03-01 NA 0.46091621
您可以使用重塑2的dcast melt