添加中断以拆分字符串字符并将这些新字符串转换为列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了添加中断以拆分字符串字符并将这些新字符串转换为列相关的知识,希望对你有一定的参考价值。

将下面的字符串字符分成多列的最有效方法是什么?

structure(list(a = structure(c(47L, 49L, 42L, 45L, 24L, 26L, 
17L, 9L, 10L, 2L, 5L, 12L, 14L, 50L, 40L, 30L, 20L, 1L, 19L, 
30L, 52L, 49L, 41L, 46L, 25L, 41L, 12L, 13L, 34L, 6L, 10L, 48L, 
38L, 44L, 23L, 38L, 36L, 12L, 28L, 4L, 31L, 8L, 11L, 8L, 9L, 
8L, 17L, 29L, 50L, 43L, 37L, 22L, 12L, 15L, 9L, 18L, 33L, 3L, 
27L, 16L, 32L, 7L, 37L, 51L, 35L, 39L, 21L, 33L, 35L, 39L), .Label = c(" 7.00", 
" 7.43", " 7.83", " 7.90", " 8.50", " 9.30", "0.20", "0.27", 
"0.30", "0.37", "0.43", "0.50", "0.53", "0.67", "0.87", "0.90", 
"1.00", "1.50", "1.67", "10.77", "12.00", "13.60", "14.73", "15.93", 
"16.47", "2.00", "2.17", "3.33", "3.53", "3.77", "4.17", "4.63", 
"4.67", "4.83", "5.07", "5.40", "5.77", "6.83", "6.93", "7.00", 
"7.17", "7.43", "7.83", "7.90", "8.50", "9.30", "Final", "A", 
"B", "C", "D", "Semifinal"), class = "factor")), class = "data.frame", row.names = c(NA, 
-70L))

我正在寻找一个如下所示的数据框:

Final
2               A  B  
3            7.43  XX
4            8.50  XX
5           15.93  XX
6            2.00  XX
7            1.00  XX
8            0.30  XX
9            0.37  XX
10           7.43  XX
11           8.50  XX
12           0.50  XX
13           0.67  XX
Semifinal
22           A     C
23           7.17  XX
24           9.30  XX
25          16.47  XX
26           7.17  XX
27           0.50  XX
28           0.53  XX
29           4.83  XX
30           9.30  XX
31           0.37  XX
49          B      D
50           7.83  XX
51           5.77  XX
52          13.60  XX
53           0.50  XX
54           0.87  XX
55           0.30  XX
56           1.50  XX
57           4.67  XX
58           7.83  XX
59           2.17  XX
60           0.90  XX
61           4.63  XX
62           0.20  XX
63           5.77  XX

我已经研究了strsplit()但我不清楚如何在这个函数中添加字母A,B,C和D的断点。

干杯,

答案

函数strsplit用于打破不同部分的字符串(单个onea,长度为1的字符向量)。例如,您可以使用它将“4.63”分成两部分:“4”和“63”。我想这不是你想要的。

字符向量就像一个字符串数组,这就是你在这里所拥有的。这也是一个问题。你从哪里得到这些数据?就像现在一样,它只相当于在一张纸上潦草写下的东西,没有真正的逻辑可以找到。这只是一排文字。首先让我们分开吧。 要查看拆分需要在哪里,我们会寻找看起来不像数字的东西,is.na(as.numeric(as.character(data$a)))。要拆分成组,我们使用split函数和一个计数器,告诉我们遇到了多少个文本实例。

spl <- split(as.character(data$a), cumsum(is.na(as.numeric(as.character(data$a)))))

(这会给你一个警告,你可以忽略),下一步是只留下数字:

spl <- sapply(spl, function(s) as.numeric(s)[!is.na(as.numeric(s))])

(再次,警告)。

But finally, what to do with this data?

你建议的最终结果不是真正的data.frame。当然你可以做一些看起来像它的东西,但是你在行之间有标题的方式不是R为它构建的。当我看到它时,我理解最后一行是“B”与“D”的分数,但这不在data.frame中。 data.frame只是一个表,看起来你给它的列名“Final”,“”和“”。这就是计算机/ R读取它的方式。所以不是很有用

我认为对这些数据最有用的是三个独立的data.frames,您只需手动分配:

Finals <- data.frame(nr=3:13, A=spl[[2]], B="XX")
Semi1 <- data.frame(nr=22:31, A=spl[[5]], C="XX")
Semi2 <- data.frame(nr=50:63, B=spl[[7]], D="XX")

最后,XX的意思是什么,只是“还不知道”?因为如果你这样分配它,最后一列是一个字符(或一个因子),这意味着如果你为它的一部分分配一个数字,那么这个数字将被转换为一个字符串。我认为分配R具有的指定未知值可能更有用:NA

以上是关于添加中断以拆分字符串字符并将这些新字符串转换为列的主要内容,如果未能解决你的问题,请参考以下文章

使用 Oracle SQL 将可变长度分隔字符串拆分为列

数据框字符串拆分为列而不是行[重复]

将数组拆分为列 pyspark-array 长度变量

将 bigquery json 字符串转换为列

将字符串拆分为列表并将项目转换为 int

如何在 Ruby 中拆分分隔字符串并将其转换为数组?