使用标题数据和正文数据重塑数据

时间:2014-07-08 10:58:54

标签: r reshape

我正在寻找一个优雅的R reshape例程/函数来将某种标题(h.1 - h.3)和body(b1 - b4)数据转换为一种格式,将每个标题行下方的正文数据分组。

所以从这个:

df.orig
   h.1 h.2 h.3  b1  b2  b3  b4
1   a1  b1  c1  r1  s1  t1  x1
2   a1  b1  c1  r1  s1  t1  x2 
3   a2  b2  c2  r2  s2  t2  z1
4   a2  b2  c2  r2  s2  t2  z2
 ....

到此:

df.reshaped 

   X.1  X.2  X.3  X.4
1   a1   b1   c1    
2   r1   s1   t1   x1
3   r1   s1   t1   x2 
4   a2   b2   c2 
5   r2   s2   t2   z1 
6   r2   s2   t2   z2 
  ....

不要介意从df.origdf.reshape的途中丢失原始标题名称。

2 个答案:

答案 0 :(得分:2)

这对你有用吗? (假设temp是您的数据集)

f <- function(x, y) rbind(as.character(x), as.character(y))
temp2 <- data.frame(unique(mapply(f, cbind(temp[, names(temp)[grepl("h", names(temp))]], NA), temp[, names(temp)[grepl("b", names(temp))]])))
names(temp2) <- paste0("X.", seq_len(4))

  X.1 X.2 X.3  X.4
1  a1  b1  c1 <NA>
2  r1  s1  t1   x1
3  r1  s1  t1   x2
4  a2  b2  c2 <NA>
5  r2  s2  t2   z1
6  r2  s2  t2   z2

答案 1 :(得分:1)

我会尝试以下内容。这取决于在body列中具有唯一值(如果它们目前不是唯一的,可以使用某种指示符变量轻松添加)。

基本概念是创建一个NA列作为第四列(因为我们最终需要多少列),并重新制作一个矩阵,其中的值是如何排序的想要他们。

mydf <- cbind(mydf[1:3], h.4 = NA, mydf[4:7])
temp <- matrix(c(t(mydf)), ncol = 4, byrow = TRUE)
unique(temp)
#      [,1] [,2] [,3] [,4]
# [1,] "a1" "b1" "c1" NA  
# [2,] "r1" "s1" "t1" "x1"
# [3,] "r1" "s1" "t1" "x2"
# [4,] "a2" "b2" "c2" NA  
# [5,] "r2" "s2" "t2" "z1"
# [6,] "r2" "s2" "t2" "z2"

如果该方法有效,您还可以查看来自&#34; gdata&#34;的interleave

library(gdata)
unique(interleave(setNames(cbind(mydf[1:3], NA), 1:4), 
                  setNames(mydf[4:7], 1:4)))
#     1  2  3    4
# 1  a1 b1 c1 <NA>
# 11 r1 s1 t1   x1
# 21 r1 s1 t1   x2
# 3  a2 b2 c2 <NA>
# 31 r2 s2 t2   z1
# 41 r2 s2 t2   z2