R 基于字符创建新列

R 基于字符创建新列,r,regex,R,Regex,如果我有一个类似的矩阵: Data = matrix( c('Ruppia A', 'Ruppia B', 'Ruppia C', 'Hydrobia A', 'Dog A', 'Cat A', 'Fresh', 'Fresh', 'Fresh','Fresh', 'Dirt', 'House'), nrow=6, ncol=2, byrow=FALSE ) 我希望能够在不丢失任何数据的情况下将类似的记录分组到一列中。大概是这样的: New_Data = matrix(

如果我有一个类似的矩阵:

Data = matrix(
  c('Ruppia A', 'Ruppia B', 'Ruppia C', 'Hydrobia A', 'Dog A', 'Cat A', 'Fresh',
    'Fresh', 'Fresh','Fresh', 'Dirt', 'House'),
  nrow=6,
  ncol=2,
  byrow=FALSE
)
我希望能够在不丢失任何数据的情况下将类似的记录分组到一列中。大概是这样的:

New_Data = matrix(
  c('Ruppia A', 'Ruppia B', 'Ruppia C', 'Hydrobia A', 'Dog A', 'Cat A', 'Fresh',
    'Fresh', 'Fresh','Fresh', 'Dirt', 'House', 'Ruppia', 'Ruppia', 'Ruppia',
    'Ruppia', 'Dog', 'Cat'),
  nrow=6,
  ncol=3,
  byrow=FALSE
)

对于一些记录,我们可以简单地将其归为Ruppia属,但并非所有的分类都是基于Ruppia属的分类,可能需要合并。我只对这一分析中的少数物种感兴趣,并不一定需要它来返回所有物种。在本例中,我们对“狗”和“猫”不感兴趣,如果这样做更容易,它们可能会被删除

如果您的新列与第一列相似,但在空格后加上大写字母,例如a,则您只需执行以下操作:

Data <- as.data.frame(Data) # turn into data frame first

Data %>% mutate(V1_new = gsub(" [A-Z]$", "", V1))
          V1    V2   V1_new
1   Ruppia A Fresh   Ruppia
2   Ruppia B Fresh   Ruppia
3   Ruppia C Fresh   Ruppia
4 Hydrobia A Fresh Hydrobia
5      Dog A  Dirt      Dog
6      Cat A House      Cat

如果新列与第一列相似,但在空格后加上大写字母,例如a,则您可以简单地执行以下操作:

Data <- as.data.frame(Data) # turn into data frame first

Data %>% mutate(V1_new = gsub(" [A-Z]$", "", V1))
          V1    V2   V1_new
1   Ruppia A Fresh   Ruppia
2   Ruppia B Fresh   Ruppia
3   Ruppia C Fresh   Ruppia
4 Hydrobia A Fresh Hydrobia
5      Dog A  Dirt      Dog
6      Cat A House      Cat
我们可以使用str_移除

我们可以使用str_移除

附加解决方案

Data %>% 
  as_tibble() %>% 
  tidyr::extract(V1, "out", remove = F)
附加解决方案

Data %>% 
  as_tibble() %>% 
  tidyr::extract(V1, "out", remove = F)

也许gsub[A-Z]$,V1更能防止错误。只是一个化妆的例子:Ruppia Qwerty a将与您的正则表达式一起变成Ruppia WERTY。您完全正确-相应地编辑了我的解决方案!也许gsub[A-Z]$,V1更能防止错误。只是一个化妆的例子:Ruppia Qwerty a将与您的正则表达式一起变成Ruppia WERTY。您完全正确-相应地编辑了我的解决方案!