我有一个二手数据源,该数据帧在一列中有很多关键信息,用空格隔开。由于某些关键信息的名称中有空格,因此我不能简单地使用str_split,但是它们的前面是分组变量。这是使用食物和食物组的示例:

foo1 <- paste('FRUIT', 'Apple', 'PROTEIN', 'Chicken', 'STARCH', 'Banana Bread', 'FRUIT', 'Strawberry')
foo2 <- paste('PROTEIN', 'Pork', 'FAT', 'Butter', 'FRUIT', 'Banana', 'STARCH', 'Spaghetti')
foo3 <- paste('FRUIT', 'Strawberry', 'PROTEIN', 'Lean Steak', 'FRUIT', 'Strawberry', 'STARCH', 'Potato')

df <- rbind(foo1, foo2, foo3)
df

foo1 "FRUIT Apple PROTEIN Chicken STARCH Banana Bread FRUIT Strawberry"
foo2 "PROTEIN Pork FAT Butter FRUIT Banana STARCH Spaghetti"
foo3 "FRUIT Strawberry PROTEIN Lean Steak FRUIT Strawberry Starch Potato"

在这种情况下,我想抓住的关键部分是实际食物,但是由于存在“香蕉面包”之类的东西,所以我无法在空间上分割。因此,我只能在FRUIT,PROTEIN,STARCH或FAT上分割,但我找不到解决此问题的好方法。在我的实际表中,仍然只有4个“分组”,但是有500多个单独的项,因此尝试用空格映射特定项将是一个巨大的痛苦。以下行不起作用:
str_split(df, c('FRUIT', 'PROTEIN', 'STARCH', 'FAT'))
str_split_fixed(df, c('FRUIT', 'PROTEIN', 'STARCH', 'FAT'), 4)

有什么想法吗?提前致谢。

最佳答案

您可以使用正则表达式来做到这一点:

str_split(df, c('FRUIT|PROTEIN|STARCH|FAT'))
[[1]]
[1] ""               " Apple "        " Chicken "      " Banana Bread " " Strawberry"

[[2]]
[1] ""           " Pork "     " Butter "   " Banana "   " Spaghetti"

[[3]]
[1] ""             " Strawberry " " Lean Steak " " Strawberry " " Potato"

使用粘贴中的折叠arg将您的vec变成regex:
paste(c('FRUIT', 'PROTEIN', 'STARCH', 'FAT'), collapse = '|')
[1] "FRUIT|PROTEIN|STARCH|FAT"

最好,

科林

08-24 13:32