【问题标题】:R: Accessing vectors with integer namesR:使用整数名称访问向量
【发布时间】:2012-01-29 03:09:36
【问题描述】:

我有一个大函数,它的向量定义如下:

v <- mat.or.vec(length(communities), 1)
names(v) <- communities

而且,我在循环中访问v 的元素,如下所示

for(c in communities){
  v[c] = 1
}

在编写和测试此代码时,列表communities 是一个字符串列表。但是今天当我在一个包含communities 列表中所有整数值的数据集上运行它时,我的函数崩溃了。我花了一段时间才弄清楚,当communities 是一个整数列表时,c 是一个整数,v[c] 访问的是 v 的 cth 元素而不是 @ 的元素987654330@,名称为c

我可以使用v[as.character(c)] 之类的东西来解决这个问题。有许多这样的变量面临同样的问题。

这个问题有更优雅的解决方案吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    嗯,最简单的更改是在for 语句中:

    for(c in as.character(communities)){
      v[c] = 1
    }
    

    或矢量化:

    v[as.character(communities)] <- 1
    

    或者为了获得更多控制权,您可以自己进行比赛:

    idx <- match(communities, names(v))
    v[idx] <- 1
    

    【讨论】:

      【解决方案2】:

      不知道为什么要命名向量的元素——有点浪费。为什么不干呢

      v <- mat.or.vec(length(communities), 1)  # or better: v<- rep(NA,length(communities)  
      for (i in 1: length(communities)) { 
           v[i] <- 1  
       }
      

      但如果您需要使用 communities 元素的值,则需要包含一些引号:

      Rgames> mat.or.vec(3, 1)->bar
      Rgames> names(bar)<-4:6
      Rgames> bar
      4 5 6 
      0 0 0 
      Rgames> bar['4']
      4 
      0 
      Rgames> bar[4]
      <NA> 
       NA 
      

      我假设您提供了一个简化的示例,并且您需要做一些比简单地将 v 的所有元素的值设置为 1 更复杂的事情。

      【讨论】:

      • 是的,我需要比分配 1 复杂得多的事情。我不能包含引号,因为我无法控制社区的生成方式。
      猜你喜欢
      • 2023-03-31
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      相关资源
      最近更新 更多