我正在寻找一个优雅的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.orig
到df.reshape
的途中丢失原始标题名称。
答案 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