[R]按设定的列数将字符向量拆分为数据帧行

时间:2018-07-05 21:19:55

标签: r dataframe vector multiple-columns

我似乎找不到特别的地方(我在这里How to split a character vector into data frame?看)和其他一些地方。

我正在尝试将R中的字符向量拆分为具有一定列数的数据帧,并在NA中填充任何多余字符或缺失内容。如下(可重现):

###Reproduce column vector
cv <- c("a1", "b1", "c1", "d1", "e1", "f1", "aa2", "bb2", "cc2", "dd2", "ee2", "ff2", "x1", "x2", "x3", "x4", "x5", "x6", "rr2", "tt3", "bb4")

###Desired data frame separating 6 columns
df.desired <- data.frame(col1=c("a1","aa2","x1","rr2"),col2=c("b1","bb2","x2","tt3"),col3=c("c1","cc2","x3","bb4"),col4=c("d1","dd2","x4",NA),col5=c("e1","ee2","x5",NA),col6=c("f1","ff2","x6",NA),stringsAsFactors = F)

谢谢!

2 个答案:

答案 0 :(得分:2)

1)基础创建所需尺寸的NA值矩阵,然后使用cv填充至其长度。转置该位并将其转换为数据帧。

mat <- t(replace(matrix(NA, 6, ceiling(length(cv) / 6)), seq_along(cv), cv))
as.data.frame(mat, stringsAsFactors = FALSE)

2)另一个基本解决方案:使用cv2的{​​{1}}副本将其长度扩展到所需长度,然后将其重塑为矩阵。我们使用cv来保留原始的cv2,但是如果您不介意在cv的末尾添加NA,则可以使用它代替创建cv将代码减少一行(如果我们可以使用cv2而不需要一个数据帧,则减少两行代码)。此解决方案通过使用mat的{​​{1}}参数来避免使用转置。

byrow

3)使用ts的基本解决方案:该解决方案通过从matrix对象的时间中提取行索引和列索引来获取行索引和列索引,而不是通过数值计算来计算维度。为此,创建cv2 <- cv length(cv2) <- 6 * ceiling(length(cv) / 6) mat <- matrix(cv2,, 6, byrow = TRUE) as.data.frame(mat, stringsAsFactors = FALSE) ts对象的时间ttts本身是一个cv对象,其中tt是行索引号,ts是列索引号。最后使用as.integer(tt)

cycle(tt)

4)滚动应用像(3)一样,该操作未明确计算tapply的尺寸。它通过简单的功能tt <- time(ts(cv, frequency = 6)) mat <- tapply(cv, list(as.integer(tt), cycle(tt)), c) as.data.frame(mat, stringsAsFactors = FALSE) r在zoo软件包中使用mat来避免这种情况。 rollapply函数返回其参数Fill,在右边填充NA,长度为6。

Fill

在上面的所有替代方法中,如果矩阵x作为结果足够,则省略最后一行。

答案 1 :(得分:1)

1)基本R -split vector,使用由gl创建的分组变量,然后在NA的末尾附加{ {1}}

length<-