根据字符串的首字母对 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
我在 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