【问题标题】:R: Categorizing column dependent on value in another column (same characters exist)R:根据另一列中的值对列进行分类(存在相同的字符)
【发布时间】:2022-02-04 22:53:02
【问题描述】:

我确信有一个痛苦的简单解决方案,但考虑到我是 R 的新手,我有点难过。

我有一个大型数据集,其中数据结构相应。

  v1 
1  US2  
2  L1_US24  
3  US2_0   
4  US24
5  US245
6  US245
7  US24 L
8  US3

我想做的是根据 v1 中的值创建一个分类列,如下所示:

  v1          Cat 
1  US2         1  
2  L1_US24     2  
3  US2_0       1  
4  US24        2  
5  US245       3  
6  US245       3
7  US24 L      2
8  US3         4

现在,如果它是一个二元选择,我可以很容易地使用 \'grepl\' 和 \'ifelse\' 来相应地分配值。但是,我不确定这是否是在列中包含相同值的大型数据集中执行此操作的有效方法。

谁能提供一些关于如何达到预期结果的建议?

  • 嗨 alec22,请注意:我猜 Cat 数字应该是 4 而不是 5US3(即最后一行)。干杯。

标签: r grepl


【解决方案1】:

请找到一个更通用的解决方案来回答您遇到的不同情况。

代表

仅使用 Base R 的解决方案

  • 代码
# Extract codes 'USXXX'
code <- regmatches(df$V1, regexpr("US\\d+", df$V1))

# Convert codes into numeric categories and add the in the 'Cat' column
df$Cat <- as.numeric(factor(code, levels = unique(code)))
  • 输出
df
#>        V1 Cat
#> 1     US2   1
#> 2 L1_US24   2
#> 3   US2_0   1
#> 4    US24   2
#> 5   US245   3
#> 6   US245   3
#> 7  US24 L   2
#> 8     US3   4

使用stringr 的解决方案

  • 代码
# Extract codes 'USXXX'
code <- stringr::str_extract(df$V1, "US\\d+")

# Convert codes into numeric categories and add them in the 'Cat' column
df$Cat <- as.numeric(factor(code, levels = unique(code)))
  • 输出
df
#>        V1 Cat
#> 1     US2   1
#> 2 L1_US24   2
#> 3   US2_0   1
#> 4    US24   2
#> 5   US245   3
#> 6   US245   3
#> 7  US24 L   2
#> 8     US3   4
  • 数据
df <- data.frame(V1 = c("US2", "L1_US24", "US2_0", "US24", "US245", "US245", "US24 L", "US3"))

reprex package (v2.0.1) 于 2022 年 2 月 4 日创建

【讨论】:

  • 您好,非常感谢。一个问题,如果我想将类别更改为特定字符或短语而不是数字,我将如何实现?
  • @alec22,恐怕很难绝对回答:可以考虑的案例太多了。无论如何,在最简单的情况下,如果您想更改数字,例如通过“XZ”来获得“USXZ”代码,您只需将"US\\d+" 更改为"USXZ",它应该可以工作。希望这可以帮助。
  • 嘿@alec22,如果此答案满足您的需求,请考虑将其标记为已验证和/或已投票,以便其他 SO 用户更容易找到正确的答案。干杯。
  • 啊抱歉,我是afk。
  • 不用担心@alec22,非常感谢您的反馈。干杯。
【解决方案2】:

您可以转换为因子,然后转换为数字:

df$Cat <- as.numeric(factor(df$v1, levels = unique(df$v1)))

df
     v1 Cat
1   US2   1
2  US24   2
3   US2   1
4  US24   2
5 US245   3
6 US245   3
7 US243   4
8   US3   5

【讨论】:

  • 嗨,谢谢你看这个。有没有办法通过检查列中是否包含一组特定的字符串模式来做到这一点?也就是说,如果它包含“US2”,则归入类别 1,但如果它包含“US24”,则归入类别 2。不幸的是,仅计算位数是行不通的。
  • 你有多少级?你可以手动完成。
  • 这是一个相当大的数据集(数千个值),并且增长非常规律。有时需要创建新类别(但我可以手动创建),但我需要填充此分类列。
  • 告诉我您对编辑后的答案有何看法?
猜你喜欢
  • 2019-02-25
  • 1970-01-01
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 2023-01-18
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多