r - R - 通过在相同前缀上匹配值同时截断发散后缀来处理 data.table 中的字符变量
问题描述
我目前有一个看似简单的任务,但由于数据集非常大,手动手动完成任务是不可行的。
存储与该名称对象相对应的数据的一列和许多其他列data.table
,例如和。变量是字符类型,其他是数字类型。name
var1
var2
var3
name
现在的问题。名称可以以相同的开头(相同的前缀)但可能以不同的结尾(不同的后缀)。例如,想象一下不同类别的植物物种或具有不同法律实体形式的公司名称。
我的一般问题是,是否有一种简单的方法可以匹配具有相同前缀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 条目的数据集。提前感谢您的任何建议!
解决方案
如果您也对替代解决方案感兴趣,我认为这也会对您有所帮助:
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
推荐阅读
- python - 使用条件连接循环中的字符串列表中的元素
- sql-server - 创建在一个字段中处理多个字段的视图
- laravel - 通过 composer 安装 laravel 和 backoffice(全新安装和集成)
- html - 在 Firefox 的 Bootstrap 布局中使用溢出和粘性项目有时会产生不需要的垂直空间
- php - 查询数据库的最后修改日期
- python - 使用opencv-python从不同cpu上的同一视频中获取不同的有效帧号?
- azure - 使用 Invoke-AzsRegistrationValidation 时 Azure Powershell 命令失败
- algorithm - 将 14 人分成 4 人一组,这样每个人至少见面一次
- c# - ImageHandlers 和 GetEncoder 在当前上下文 xamarin 中不存在,该怎么办?
- mysql - dbGetQuery 选择所有现有列