【问题标题】:Map array of strings to an array of integers将字符串数组映射到整数数组
【发布时间】:2014-07-20 10:46:05
【问题描述】:

假设我在数据框中有一列颜色为c("Red", "Blue", "Blue", "Orange")。 我想得到它作为c(1,2,2,3)

Red as 1
Blue as 2
Orange as 3

除了明显的 if/else 或 switch 函数之外,还有更简单的方法吗?

【问题讨论】:

  • match(x, unique(x)),或者更正式的说法是as.integer(factor(x, levels = unique(x)))

标签: r function


【解决方案1】:

设置一个命名向量,描述颜色和整数之间的联系(即特别是字符串如何映射到整数):

colors=c(1,2,3)
names(colors)=c("Red", "Blue", "Orange")

现在使用命名向量生成与数据框中的颜色相关的数字列表:

>colors[c("Red","Blue","Blue","Orange")]
   Red   Blue   Blue Orange 
     1      2      2      3 

更新以解决以下问题。这是我认为您正在尝试做的一个示例。

dataframe=data.frame(Gender=c("F","F","M","F","F","M"))
strings=sort(unique(dataframe$Gender))
colors=1:length(strings)
names(colors)=strings
dataframe$Colours=colors[dataframe$Gender]

可以看看结果:

> dataframe
  Gender Colours
1      F      1
2      F      1
3      M      2
4      F      1
5      F      1
6      M      2

请注意,此示例假定您没有考虑性别和颜色之间的特定映射。如果确实如此,那么只关注@alexis_laz 的评论可能会更简单。

【讨论】:

  • 问题是我的数据框中的行数以千计
  • @user2500781。您可以将CnrL 解决方案修改为 setNames(1:3,unique(dat$colors))[dat$colors] Red Blue Blue Orange 1 2 2 3
  • 我不明白为什么这是一个问题:数千=sample(c("Red", "Blue", "Orange"),2000,replace=TRUE);颜色[千]
  • 也许你需要澄清这个问题。您的字符串列中是否有数千个唯一字符串或数千行需要映射到整数,或两者兼有?
  • 我会试试这个听起来很有希望。我在列中有大约一百个独特的字符串。
【解决方案2】:

我一定遗漏了一些东西,但我相信这种方法会奏效。用文字(下面的“名称”)将您的列强制为一个因素后,您revalue他们用您的“颜色”数字。

require(plyr)

colors <- c("1","2","3")
names <- c("Red", "Blue", "Orange")
df <- data.frame(names, colors)
df$names <- as.factor(df$names)
df$names <- revalue(x = df$names, c("Red" = 1, "Blue" = 2, "Orange" = 3))

【讨论】:

  • ".helpForCall(topicExpr, parent.frame()) 中的错误:没有用于“重估”的方法,也没有将其作为函数的文档”
  • 感谢您的评论。我添加了 require(plyr)
  • 啊。感谢您的解决方案。
  • 如果你喜欢它,你可以给它一个加号,向上箭头在 0 上。
【解决方案3】:

使用car::recode()函数:

library(car)

recode(x, "'Red'=1; 'Blue'=2; 'Orange'=3;")
# [1] 1 2 2 3

【讨论】:

    【解决方案4】:

    这是一个基于之前代码的函数:

    # Recode 'string' into 'integer'
    recode_str_int <- function(df, feature) {
    
      # 1. Unique values
    
      # 1.1. 'string' values
      list_str <- sort(unique(df[, feature]))
    
      # 1.2. 'integer' values
      list_int <- 1:length(list_str)
    
      # 2. Create new feature
    
      # 2.1. Names
      names(list_int) = list_str
      df$feature_new = list_int[df[, feature]]
    
      # 3. Result
      df$feature_new
    
    } # recode_str_int
    

    这样称呼:

     df$new_feature <- recode_str_int(df, "feature")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      • 2012-01-23
      • 2021-11-15
      • 2017-01-31
      • 2013-03-20
      • 1970-01-01
      • 2019-02-23
      相关资源
      最近更新 更多