我在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
为了确定将在这个新列中形成的组,我想创建一个包含可能组的数组(因为所有行都将包含在其中一个组中)(例如{{1 }})
任何人都可以放弃如何有效地做到这一点吗? (没有让for循环必须这样做,因为我有数百万行,这需要很长时间)
答案 0 :(得分:3)
您也可以尝试
> data$group <- (str_extract(TEXTFIELD, "[aA-zZ]+"))
> data
ID TEXTFIELD group
1 1 VGH2130 VGH
2 2 BFGF2345 BFGF
3 3 VGH3321 VGH
答案 1 :(得分:1)
如果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
答案 2 :(得分:1)
文本字段的数字前面总是有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