如何将一列字符串分成多列,每列包含一个字符串的单个字符,且字符串长度不等且没有分隔符?

流线55

我的数据框是这样的:

data.frame(stringsAsFactors=FALSE,
       A = c("1234", "abc.", "e-2.1ad"),
       B = c("5-4", "1-0", "a,d")
)

我想将各列分成多个包含单个字符的列。

我找到的其他答案都涉及使用一些正则表达式,模式或分隔符(如您所见,在这里我不能做到),或使用sapply(使用该位置但对我而言无效的)复杂的解决方案我敢肯定那里有一个更优雅的解决方案,tidyr如果可能的话,我真的很想使用一个解决方案,但是无论如何进行清理都是值得赞赏的。

说完之后,这就是它想要的:

 newdf <- data.frame(stringsAsFactors=FALSE,
      A1 = c("1", "a", "e"),
      A2 = c("2", "b", "-"),
      A3 = c("3", "c", "2"),
      A4 = c("4", ".", "."),
      A5 = c(NA, NA, 1),
      A6 = c(NA, NA, "a"),
      A7 = c(NA, NA, "d"),
      B1 = c("5", "1", "a"),
      B2 = c("-", "-", ","),
      B3 = c("4", "0", "d")
)

而且,如果答案不只是向其中抛出一个或两个函数,那么如果您能解释如何实现它,而不仅仅是解决方案本身,我将不胜感激。谢谢!

后来的编辑:我几乎可以使用该qdap来做它,但是我可以解决这个问题,用字符串开头的字符填充本来应该是NA(由于字符串长度不等)。非常奇怪的行为,文档中没有说明,否则是非常有前途的功能。

我在la脚中发现的另一种奇怪行为试图解决此问题,该行为是自动从字符转换为因素。但是,我无法查明沿途发生的情况。

Ben

有多种可能的选择,具体取决于您感兴趣的内容。有关5-432中缺少32的信息,请参见上面的@Elin评论。

一种可能的考虑是str_split_fixedstringr包装中:

str_split_fixed("1234", "", 7)

     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] "1"  "2"  "3"  "4"  ""   ""   ""  

空模式“”将按字符分割,在这种情况下,尝试返回7个字符矩阵(最后3个空字符串)。现在,如果没有可用的字符,它将返回一个空字符串,而不是NA。(请参阅github问题)。

如果列数基于A和B列可能的最大字符数(例如7和5),则可以执行以下操作:

as.data.frame(lapply(df, function(x) str_split_fixed(x, "", n=max(nchar(x)))))

  A.1 A.2 A.3 A.4 A.5 A.6 A.7 B.1 B.2 B.3 B.4 B.5
1   1   2   3   4               5   -   4   3   2
2   a   b   c   .               1   -   0        
3   e   -   2   .   1   a   d   a   ,   d        

注意:以后用NA替换空字符串:

df[df==""] <- NA

  A.1 A.2 A.3 A.4  A.5  A.6  A.7 B.1 B.2 B.3  B.4  B.5
1   1   2   3   4 <NA> <NA> <NA>   5   -   4    3    2
2   a   b   c   . <NA> <NA> <NA>   1   -   0 <NA> <NA>
3   e   -   2   .    1    a    d   a   ,   d <NA> <NA>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章