根据字符创建新列

时间:2020-04-17 13:26:53

标签: 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(
  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),但并非所有分组都将仅基于属进行分组,并且可能必须合并。我只对少数物种感兴趣,可以进行此分析,而不一定需要它来返回所有物种。在此示例中,我们对“狗”和“猫”不感兴趣,如果可以简化操作,可以将它们删除。

3 个答案:

答案 0 :(得分:2)

如果您的新列与第一列一样,但是在空格后面加上了大写字母(例如“ 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

答案 1 :(得分:1)

我们可以使用str_remove

library(dplyr)
library(stringr)
Data %>%
    as_tibble %>%
    mutate(V1_new = str_remove(V1, "\\s+[A-Z]$"))

答案 2 :(得分:1)

其他解决方案

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