根据字符串的首字母对 R 中的类别进行分组?

Group categories in R according to first letters of a string?

我在 R 中加载了一个数据集,其中一列包含文本。此文本不是唯一的(任何行都可以具有相同的值)但它表示行的特定条件,因此此字段的前 3-5 个字母将表示行所属的组。让我用一个例子来解释。

有 3 个不同的行,只显示 id 和我需要分组的列:

ID........... TEXTFIELD    
1............ VGH2130    
2............ BFGF2345    
3............ VGH3321

在前面的示例中,我想在数据框中创建一个新列,将在其中设置组,例如

ID........... TEXTFIELD........... NEWCOL    
1............ VGH2130............. VGH    
2............ BFGF2345............ BFGF    
3............ VGH3321............. VGH

为了确定将在这个新列中形成的组,我想制作一个包含可能要制作的组的数组(因为所有行都将包含在这些组之一中)(例如 c <- ("VGH","BFGF",......) )

任何人都可以说明如何有效地做到这一点吗? (无需创建 for 循环,因为我有数百万行,这需要很长时间)

你可以试试,如果df是你的data.frame:

df$NEWCOL <- gsub("([A-Z)]+)\d+.*","\1", df$TEXTFIELD)

> df
#  ID TEXTFIELD NEWCOL
#1  1   VGH2130    VGH
#2  2  BFGF2345   BFGF
#3  3   VGH3321    VGH

你也可以试试

> data$group <- (str_extract(TEXTFIELD, "[aA-zZ]+"))
> data
  ID TEXTFIELD group
1  1   VGH2130   VGH
2  2  BFGF2345  BFGF
3  3   VGH3321   VGH

文本字段的数字前面是否总是有 3 或 4 个字母?

您可以通过以下方式检查:

nrow(data[grepl("[aA-zZ]{1,4}\d+", data$TEXTFIELD)== TRUE, ]) #this gives number of rows where TEXTFIELD contains 3,4 letters followed by digits

如果是,那么:

require(stringr)
data$NEWCOL <- str_extract(data$TEXTFIELD, "[aA-zZ]{1,4}")

最后一步:

data$group <- ifelse(data$NEWCOL == "VGH", "Group Name", ifelse(data$NEWCOL == "BFGF", "Group Name", ifelse . . . . ))

# Complete the ifelse statement to classify all groups