首页 > 解决方案 > R - 通过在相同前缀上匹配值同时截断发散后缀来处理 data.table 中的字符变量

问题描述

我目前有一个看似简单的任务,但由于数据集非常大,手动手动完成任务是不可行的。

存储与该名称对象相对应的数据的一列和许多其他列data.table,例如和。变量是字符类型,其他是数字类型。namevar1var2var3name

现在的问题。名称可以以相同的开头(相同的前缀)但可能以不同的结尾(不同的后缀)。例如,想象一下不同类别的植物物种或具有不同法律实体形式的公司名称。

我的一般问题是,是否有一种简单的方法可以匹配具有相同前缀name的变量的所有值,并在丢弃“发散”后缀的同时为其分配“相同”前缀。有关“抽象”示例数据,请参见下文。

编辑名称不是由下划线而是由空格分隔,并且可以有多个单词(不仅限于两个单词)

编辑 2应保留最长的共享前缀。添加了一些示例来说明这一点。建议的解决方案将导致最后一个条目是“American”而不是“American Tulip”。

Name                  Var1   Var2   Var3
Rose red              22     12     3.5
Rose Yellow           12     13     4.8
Rose orange           18     14     5.0
Rose dark orange      17     12     4.9
Tulip red             44     21     9.2
Tulip yellow          33     25     7.2
Tulip Orange          38     12     9.4
American Tulip red    22     12     3.3
American Tulip orange 31     16     4.5

我想得到一个像下面这样的“整洁”表,以允许为每个“最分层的类”聚合数据和计算统计信息。

Name                  Var1   Var2   Var3
Rose                  22     12     3.5
Rose                  12     13     4.8
Rose                  18     14     5.0
Rose                  17     12     4.9
Tulip                 44     21     9.2
Tulip                 33     25     7.2
Tulip                 38     12     9.4
American Tulip        22     12     3.3
American Tulip        31     16     4.5

我非常感谢任何输入,因为我需要将此逻辑应用于具有约 250k 条目的数据集。提前感谢您的任何建议!

标签: rdata.table

解决方案


如果您也对替代解决方案感兴趣,我认为这也会对您有所帮助:

library(dplyr)
library(stringr)

df <- tribble(
  ~Name,           ~Var1,   ~Var2,   ~Var3,
  "Rose_red",       22,     12,     3.5,
  "Rose_yellow",    12,     13,     4.8,
  "Rose_orange",    18,     14,     5.0,
  "Tulip_red",      44,     21,     9.2,
  "Tulip_yellow",   33,     25,     7.2,
  "Tulip_orange",   38,     12,     9.4
)

df %>%
  mutate(Name = str_extract(Name, "[A-Za-z]+"))

# A tibble: 6 x 4
  Name   Var1  Var2  Var3
  <chr> <dbl> <dbl> <dbl>
1 Rose     22    12   3.5
2 Rose     12    13   4.8
3 Rose     18    14   5  
4 Tulip    44    21   9.2
5 Tulip    33    25   7.2
6 Tulip    38    12   9.4


推荐阅读