我怎样才能重塑这些数据?

时间:2013-05-30 12:44:37

标签: r reshape

我有一些数据要重塑 R ,但无法弄清楚如何。 这是场景: 我有这样的数据

a<- c("exam1", "exam2", "exam3","exam4")
date1<- c(8.2,4.3,6.7,3.9)
date2<- c(11.2,9.3,6.5,4.1)
date3<- c(8.2,9.1,4.3,4.4)
dr.df.a <- cbind(a,date1,date2,date3)
    a       date1 date2  date3
[1,] "exam1" "8.2" "11.2" "8.2"
[2,] "exam2" "4.3" "9.3"  "9.1"
[3,] "exam3" "6.7" "6.5"  "4.3"
[4,] "exam4" "3.9" "4.1"  "4.4"
b<- c("exam1", "exam2", "exam3","exam4")
date1<- c(8.6,14.3,6.7,13.9)
date2<- c(11.2,8.3,16.5,14.1)
date3<- c(4.2,9.1,4.3,14.4)
dr.df.b <- cbind(b,date1,date2,date3)
   b       date1  date2  date3 
[1,] "exam1" "8.6"  "11.2" "4.2" 
[2,] "exam2" "14.3" "8.3"  "9.1" 
[3,] "exam3" "6.7"  "16.5" "4.3" 
[4,] "exam4" "13.9" "14.1" "14.4"

mylist<–list(dr.df.a,dr.df.b)

这个例子是可重复的建议。我得到这种格式的数据(dr.df.a和dr.df.b)列表对象中有多个数据框。
现在我需要重塑它,以获得一个单行和变量名称 exam1_date1, exam1_date2 , exam1_date3, exam2_date1,exam2_date2 ...等等,基本上我想为列表对象中的每个数据帧获取exam1_date1, exam1_date2 , exam1_date3, exam2_date1,exam2_date2 ...行的数据框。 我如何重塑这些数据以及我应该使用哪种功能?

3 个答案:

答案 0 :(得分:2)

试试这个:

library(reshape2)

# convert the first row (the one defined by variable 'a' in post) into column names
dr.df.2 <- setNames(dr.df[-1,], dr.df[1, ])

m <- melt(dr.df.2)

d <- dcast(m, 1 ~ ...)[-1]
names(d) <- sub("_", "_exam", names(d)) # fix up names (optional)

给予:

> d
  date1_exam1 date1_exam2 date1_exam3 date1_exam4 date2_exam1 date2_exam2
1         8.2         4.3         6.7         3.9        11.2         9.3
  date2_exam3 date2_exam4 date3_exam1 date3_exam2 date3_exam3 date3_exam4
1         6.5         4.1         8.2         9.1         4.3         4.4

更新:简化dcast公式

答案 1 :(得分:1)

如果您的dr.df对象是data.frame而不是矩阵,则可以轻松创建命名向量,如下所示:

创建您的数据,但这次是data.frame

a <- c("exam1", "exam2", "exam3","exam4")
date1 <- c(8.2,4.3,6.7,3.9)
date2 <- c(11.2,9.3,6.5,4.1)
date3 <- c(8.2,9.1,4.3,4.4)
dr.df <- rbind(date1, date2, date3)
colnames(dr.df) <- a
dr.df <- as.data.frame(dr.df)
dr.df
#       exam1 exam2 exam3 exam4
# date1   8.2   4.3   6.7   3.9
# date2  11.2   9.3   6.5   4.1
# date3   8.2   9.1   4.3   4.4

&#34;重塑&#34;步骤

您现在可以使用stack以长格式获取数据。

dr.dfL <- data.frame(stack(dr.df), date = rownames(dr.df))

您想要的矢量值位于&#34;值&#34;列,以及这些值的名称可以使用paste获得。

setNames(dr.dfL$values, paste(dr.dfL$ind, dr.dfL$date, sep = "_"))
# exam1_date1 exam1_date2 exam1_date3 exam2_date1 exam2_date2 exam2_date3 
#         8.2        11.2         8.2         4.3         9.3         9.1 
# exam3_date1 exam3_date2 exam3_date3 exam4_date1 exam4_date2 exam4_date3 
#         6.7         6.5         4.3         3.9         4.1         4.4 

请注意,此处的结果只是一个命名向量,而不是data.frame,与其他答案一样。

答案 2 :(得分:0)

您可以使用基础R的重塑:

new <- reshape(dr, varying = list(c("date1","date2","date3")), direction = "long")
new$newname <- apply(new, 1, function(x) paste(x[1],paste("date",x[2],sep=""),sep="_"))
new <- new[,c("date1","newname")]
names(new) <- c("info","exam")

输出:

> new
    info        exam
1.1  8.2 exam1_date1
2.1  4.3 exam2_date1
3.1  6.7 exam3_date1
4.1  3.9 exam4_date1
1.2 11.2 exam1_date2
2.2  9.3 exam2_date2
3.2  6.5 exam3_date2
4.2  4.1 exam4_date2
1.3  8.2 exam1_date3
2.3  9.1 exam2_date3
3.3  4.3 exam3_date3
4.3  4.4 exam4_date3