gpt4 book ai didi

r - 如何拆分列中的所有字符串并在所有新数据中包含前缀

转载 作者:行者123 更新时间:2023-12-02 02:58:54 25 4
gpt4 key购买 nike

我有一个数据集,其中的数据在一列中输入,而这些数据本应放入三个单独的列中。我希望根据反斜杠将其分成三列,但每个分割必须包含一个仅在字符串的第一部分中找到的字符前缀和一个仅在末尾处找到的字符后缀。

所以像“PC211/212.5(C)/664F”这样的东西有前缀“PC”和后缀“F”。前缀始终为 2 个字母,后缀始终为 1,并且它们始终是字符。前缀后面始终跟有数字代码,后缀前面始终跟有数字或结束括号

我的数据位于一个非常大的数据框中,因此我希望能够按列将其调出。这是我正在使用的一小部分数据的可重现示例:

df <- data.frame("code" = c("PC211/212.5(C)/664F", "VC23152(A)/23550F", "PC459/460(B)M", "PC187(A)/664F"), stringsAsFactors = FALSE)

我希望它返回如下内容:

df_id_like <- data.frame("code" = c("PC211/212.5(C)/664F", "VC23152(A)/23550F", "PC459/460(B)M", "PC187(A)/664F"), 
"code_1" = c("PC211F", "VC23152(A)F", "PC459M", "PC187F"),
"code_2" = c("212.5(C)F", "VC23550F", "PC460(B)M", "PC664F"),
"code_3" = c("PC664F", NA, NA, NA),
stringsAsFactors = FALSE)

我认为该解决方案可能需要正则表达式,但我完全愿意接受不需要正则表达式的解决方案!

最佳答案

使用separatetidyr选项

library(dplyr)
library(tidyr)
df %>% separate(code, paste0("code_", 1:3), sep = "/", fill = "right", remove = F)
# code code_1 code_2 code_3
#1 PC211/212.5(C)/664F PC211 212.5(C) 664F
#2 VC23152(A)/23550F VC23152(A) 23550F <NA>
#3 PC459/460(B)M PC459 460(B)M <NA>
#4 PC187(A)/664F PC187(A) 664F <NA>

请注意,您的预期输出似乎与您的输入数据不匹配。例如,对于第 1 行,code_3 的预期输出为 "PC664F",而相关输入字符串为 "664F"。同一行的 code_2 具有 “212.5(C)F”,而输入字符串为 “212.5(C)”。我认为这些都是错误。

<小时/>

更新

感谢@andrew_reece 的评论,我(想我)现在理解了你的问题。这是一个选项

df %>%
rowid_to_column("row") %>%
separate(code, c("prefix", "main", "suffix"), sep = c(2, -1), remove = F) %>%
separate(main, into = paste0("code_", 1:3), sep = "/", fill = "right") %>%
gather(key, entry, starts_with("code_")) %>%
filter(!is.na(entry)) %>%
unite(entry, prefix, entry, suffix, sep = "") %>%
spread(key, entry) %>%
select(-row)

说明:我们首先将前缀和后缀与代码分开,然后将各个组件与主代码分开部分。我们将形状从宽改为长,删除 NA 条目,并将每个 code 组件与之前的 prefixsuffix 连接起来从长到宽 reshape 。

这会重现您的预期输出,但第 1 行中的 code_2 除外。

<小时/>

替代方案

作为一种替代方法,将前缀和后缀代码存储在 list 列中可能更有用,而不是将它们存储在带有附加列的宽格式中 code_1code_2 等等。这样做的优点是您不必对 code 列中的代码数量进行硬编码;以下方法适用于 code任意数量的代码,并且仅假设

  1. code 的前 2 个字符定义前缀
  2. code 的最后一个字符是后缀

df %>%
separate(code, c("prefix", "main", "suffix"), sep = c(2, -1), remove = F) %>%
transmute(
code,
codes_as_list = pmap(
list(prefix, str_split(main, "/"), suffix),
function(x, y, z) paste0(x, y, z)))
# code codes_as_list
#1 PC211/212.5(C)/664F PC211F, PC212.5(C)F, PC664F
#2 VC23152(A)/23550F VC23152(A)F, VC23550F
#3 PC459/460(B)M PC459M, PC460(B)M
#4 PC187(A)/664F PC187(A)F, PC664F

请注意,codes_as_list 现在是一个 list 列,具有正确的前/后缀代码,可以轻松使用 purrr::map 对元素进行操作机械。








关于r - 如何拆分列中的所有字符串并在所有新数据中包含前缀,我们在Stack Overflow上找到一个类似的问题:

https://stackoverflow.com/questions/56104718/




25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com