r - 添加中断以拆分字符串字符并将这些新字符串转换为列
问题描述
将下面的字符串字符分成多列的最有效方法是什么?
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))])
(再次警告)。
但最后,如何处理这些数据?
您建议的最终结果并不是真正的data.frame
. 当然,你可以制作一些看起来像它的东西,但是你在两行之间有标题的方式并不是 R 所构建的。当我查看它时,我知道最后一行是“B”对“D”的分数,但这不在 data.frame 中。data.frame 只是一个表,看起来你给它的列名是“Final”、“”和“”。这就是计算机/R 读取它的方式。所以不是很有用
我认为对这些数据最有用的是三个单独的 data.frame,您只需要手动分配它们:
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
推荐阅读
- node.js - 关于通过 knex 使用 node.js 连接到我的 Postgres 的问题
- java - C# 加密到 Java 解密
- swift - (Swift/FireStore)如何将 URL 放入 StringArray
- python - 将类方法放在 RQ 队列上时出现 Python rq 错误
- javascript - 网站能否执行操作系统级别的监视功能,例如屏幕捕获和数据包嗅探?
- oracle - 用于测试班级学生人数的 Oracle-Trigger
- android - OpenGL ES 2.0/3.0 中的彩虹色效果。更换黑色区域
- ssh - 将 VSCODE 与 Google Colab 连接时出现身份验证错误
- scripting - 检索用户名列表打开了我的 Instagram 故事
- java - SQLiteBlobTooBigException - 华为设备、Android 9 和 10