在 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.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
中的第一个匹配项中添加额外的 _[^_]+
。请参阅下面的示例。
用于匹配带有附加下划线的字符串的代码
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
我在数据框中有一列唯一的照片 ID。每个照片 ID 由一长串字符组成,并以“_”分隔。
我想使用分隔符“_”将这些 ID 拆分成列。
这听起来很简单,但我想在最后一个分隔符处将字符拆分为两个特定的列。例如,如果我的照片 ID 之一是:
"TV_Banana_122_Afternoon_Pre"
我正在尝试将结果拆分为:
"TV_Banana_122_Afternoon" 和 "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
中的第一个匹配项中添加额外的 _[^_]+
。请参阅下面的示例。
用于匹配带有附加下划线的字符串的代码
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