我在数据帧中有一列唯一的照片ID。每个照片ID由一长串字符组成_&";。
我想使用分隔符"将这些ID分成列_&";。
这听起来很简单,但我想在最后一个分隔符处将字符分为两列。例如,如果我的一个照片ID是:
"TV_Banana_122_下午_;
我正试图将结果拆分为:
"TV_Banana_122_下午";以及";Pre";
有没有办法指定我只想用第四个分隔符来分隔这个短语?
您可以使用strsplit
和下面的正则表达式来分离字符串,然后使用do.call
和rbind
来创建一个新的数据帧,每个部分都在自己的列中。
匹配特定分数的代码
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
中的第一个匹配中添加额外的_[^_]+
。请参阅下面的示例。
将字符串与附加UNDERSCORE匹配的代码
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下划线的字符串,但您总是想在最后一个下划线处拆分,则可以根据下面的正则表达式将整个字符串匹配到最后一个底线。
匹配最后一个UNDERSCORE的代码
df_new2 <- data.frame(do.call("rbind", strsplit(sub('(.*)_(.*)$', '\1 \2', df), ' ')))
df_new2
输出
X1 X2
1 TV_Banana_122_Afternoon Pre