【问题标题】:Numbering elements in a vector对向量中的元素进行编号
【发布时间】:2012-02-05 02:18:50
【问题描述】:

我想给向量的元素编号,将“1”分配给向量中的最小元素。我知道如何做到这一点,但我的解决方案(包含在下面的代码)似乎过于复杂。有更简单的解决方案吗?

在下面的示例中,向量“数据”中有 5 个唯一数字。数字 3 是最小的,应分配数字“1”;数字 100 是最大的,应该分配数字“5”。

向量“数据”的所需解决方案是:c(2,3,4,4,3,1,5)

data <- c(5,8,12,12,8,3,100)
unique.numbers <- sort(unique(data))
numbering <- seq(1:length(unique(data)))
template <- cbind(numbering,unique.numbers)
output <- rep(NA, length(data))
for(i in 1:length(data)) { 
  for(j in 1:dim(template)[1]) { 
      if(data[i]==template[j,2]) output[i]=j 
  }
}
output

感谢您的任何建议。我正在努力提高我的编程效率。

马克·米勒

【问题讨论】:

    标签: r


    【解决方案1】:

    更紧凑的程序版本。

    dat <- c(5,8,12,12,8,3,100)
    dat_sorted <- sort(unique(dat))
    match(dat,dat_sorted)
    

    【讨论】:

      【解决方案2】:

      如果您使用数字或整数数据,您可以使用as.numeric(factor())

      dat <- c(5,8,12,12,8,3,100)
      as.numeric(factor(dat))
      

      另外,作为一个附注,您应该避免在 R 中使用 data 作为变量名,因为它已经是一个内置函数。

      【讨论】:

      • 重要的更正(参见 R 常见问题解答 7.10):as.numeric(as.character(factor(dat))) 否则你会伤心的。
      • 旁注错了,data在R中不是变量名,是函数名,两者有很大区别。
      • @SimonUrbanek 这就是我想说的。对困惑感到抱歉。卡尔维特霍夫,好点子。 Wojciech 上面的回答是一个更好的选择。
      【解决方案3】:

      另一种可能是:

      > rank(data)
      [1] 2.0 3.5 5.5 5.5 3.5 1.0 7.0
      

      您可以查看关于如何处理关系的参数“ties.method”。

      【讨论】:

      • 我不相信任何“ties.method”都能达到预期的效果。
      • @Dason 同意了。但是(1)我不确定 user1184072 是否与他的输出形式结婚,并且(2)如果他是,这可能是一个更好的起点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      相关资源
      最近更新 更多