我似乎找不到特别的地方(我在这里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)
谢谢!
答案 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
对象的时间tt
。 ts
本身是一个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<-