我正在使用数据集,其中大多数列都是正常的,但是有一个或多个连接值卡在一个字符串中,使用' |'作为值之间的分隔符。我需要重新整形它,以便每个现有行有一行,每个连接值。在串联字符串中有60个潜在值 - 我知道 - 并且大多数行都将0到10个值粉碎到字符串中。在接下来的几个月里,重复此过程也是必要的,并且列表可能会更改/添加新成员。
我将不得不在未知数量的未来表格上做到这一点 - 至少还有4个 - 所以如果有一种方法我可以很容易地重新利用它将会更好。另外,我使用的是t-SQL,但如果有帮助的话,我可能会引入R或其他东西。有什么想法吗?
答案 0 :(得分:0)
如果你有一个包含60个可能值的表,你可以使用这样的tsql加入它:
选择table1.id,potentialvalues.value 来自table1 内连接势能值 关于charindex(' |' + potentialvalues.value +' |',' |' + table1.concatField +' |' )大于0
注意:将管道添加到concatfield的开头和结尾,以便它可以匹配字段中的第一个和最后一个值。所以,如果你的concatfield类似于' 1 | 2 | 10'在记录上它可以匹配' | 1 |',' | 2 |'和' | 10 |'。
答案 1 :(得分:0)
在R中,您可以使用dplyr和tidyr函数通过在管道符号处分隔每个组合字符串来扩展行。这样做的好处是它可以应用到您的桌子而不需要事先了解管道组合。
library(dplyr)
library(tidyr)
separate_rows(df, string, sep = "[|]") %>%
mutate(string = trimws(string))
基础R的trimws函数用于删除管道字符串组件之间可能存在的任何额外空格。玩具测试数据和结果如下所示。
测试数据
df = data.frame(key = c("A", "B", "C", "D"),
string = c("Simple", "Piped 1 | Piped 2", "Simple 2", "Piped A1 | Piped A2 | Piped A3"), stringsAsFactors = FALSE)
> df
key string
1 A Simple
2 B Piped 1 | Piped 2
3 C Simple 2
4 D Piped A1 | Piped A2 | Piped A3
<强>结果强>
key string
1 A Simple
2 B Piped 1
3 B Piped 2
4 C Simple 2
5 D Piped A1
6 D Piped A2
7 D Piped A3