#转换行列表之前先对其进行包装

时间:2019-01-02 02:34:40

标签: r

我有旧软件的输出,该软件将每笔交易的记录包装成多行。我想将这些行包装成一个平面数据框。我找到了解开列而不是行的解决方案,并且可以在循环中完成我需要的操作,但是输出很大,与循环相比,我希望有一个更快的解决方案。

示例:我从.csv文件中读入R的有关两个事务(“ tran”)中的每一个的6条信息,这些信息打包成四行。

当我从.csv文件读入R时,以下内容代表并模拟了我的数据:

V1 <- c("tran1.col1", "tran1.col4","tran2.col1", "tran2.col4")
V2 <- c("tran1.col2", "tran1.col5", "tran2.col2", "tran2.col5")
V3 <- c("tran1.col3", "tran1.col6", "tran2.col3", "tran2.col6")
df <- as.data.frame(matrix(c(V1, V2, V3), ncol = 3))

我希望将以上内容转换为以下内容:

X1 <- c("tran1.col1", "tran2.col1")
X2 <- c("tran1.col2", "tran2.col2")
X3 <- c("tran1.col3", "tran2.col3")
X4 <- c("tran1.col4", "tran2.col4")
X5 <- c("tran1.col5", "tran2.col5")
X6 <- c("tran1.col6", "tran2.col6")
df.x <- as.data.frame(matrix(c(X1, X2, X3, X4, X5, X6), ncol = 6))

我研究了整齐的例程,以收集和传播数据文件,以及以整形的方式进行融化和变形,但是据我所知,我需要首先解开行。

1 个答案:

答案 0 :(得分:1)

如果您的所有输入都包含6条信息(无论交易多少),那么以下内容应该有效。

vec <- as.character(unlist(t(df)))
df.x <- as.data.frame(matrix(vec, ncol = 6, byrow = T))

分解以解释发生了什么...

# Transpose the df (to a matrix)
matrix <- t(df)

# Now that the matrix is in this sequence it will allow us to unlist it so 
# that it produces a vector in the correct sequence (i.e tran1.col1, 
# tran1.col2 .. tran2.col1, tran1.col2)
vec <- unlist(matrix)

# Now we can coerce it back to a data.frame, defining the number of columns
# and creating it by row (rather than column)
df.x <- as.data.frame(matrix(vec, ncol = 6, byrow = T))