在 R 中通过定界符分隔数据:如何指定在哪个定界符(例如 5 个系列中的第 4 个)分隔字符?

Separating data by delimiter in R: How can I specify at which delimiter (for example the 4th in a series of 5) that characters are separated?

我在数据框中有一列唯一的照片 ID。每个照片 ID 由一长串字符组成,并以“_”分隔。

我想使用分隔符“_”将这些 ID 拆分成列。

这听起来很简单,但我想在最后一个分隔符处将字符拆分为两个特定的列。例如,如果我的照片 ID 之一是:

"TV_Banana_122_Afternoon_Pre"

我正在尝试将结果拆分为:

"TV_Banana_122_Afternoon" 和 "Pre"

有什么方法可以指定我只想用第四个分隔符分隔这个短语吗?

您可以使用 strsplit 和以下正则表达式来分隔字符串,然后使用 do.callrbind 创建一个新的数据框,每个部分都在其自己的列中。

匹配特定下划线数的代码

df <- data.frame(x = c("TV_Banana_122_Afternoon_Pre"))

df_new <- data.frame(do.call("rbind", strsplit(sub('(^[^_]+_[^_]+_[^_]+_[^_]+)_(.*)$', '\1 \2', df), ' ')))

df_new

输出

                       X1  X2
1 TV_Banana_122_Afternoon Pre

根据@AnilGoyal 的评论,如果您需要匹配额外的下划线,您只需在 sub 中的第一个匹配项中添加额外的 _[^_]+。请参阅下面的示例。

用于匹配带有附加下划线的字符串的代码

df2 <- data.frame(x = c("TV_Banana_122_Afternoon_Test_Pre"))

df2_new <- data.frame(do.call("rbind", strsplit(sub('(^[^_]+_[^_]+_[^_]+_[^_]+_[^_]+)_(.*)$', '\1 \2', df2), ' ')))

df2_new

输出

                            X1  X2
1 TV_Banana_122_Afternoon_Test Pre

此外,如果您的字符串具有不同#s 的下划线,但您总是想在最后一个下划线处拆分,您可以根据下面的正则表达式将整个字符串匹配到最后一个下划线。

匹配最后一个下划线的代码

df_new2 <- data.frame(do.call("rbind", strsplit(sub('(.*)_(.*)$', '\1 \2', df), ' ')))
df_new2

输出

                   X1  X2
1 TV_Banana_122_Afternoon Pre