【问题标题】:R loop ascending variable namesR循环升序变量名
【发布时间】:2014-08-04 20:58:35
【问题描述】:

我正在尝试在 R 中创建一个对变量名称的循环。它应该对两个变量的和求平方根。到现在为止我有这个:

变量名称为 x1,y1, x2,y2, ... x30,y30(都在一个矩阵中,matrix$x1,matrix$x2)

x1 <- c(2,2,2,3,1,2,4,6,1)
y1 <- c(5,4,3,3,4,2,1,6,3)
x2 <- c(8,2,7,3,1,2,2,2,4)
y2 <- c(1,3,3,3,1,2,4,3,7)
x3 <- c(4,4,1,2,4,6,3,2,3)
y3 <- c(1,2,3,3,1,2,4,6,6)
matrix <- cbind(x1,y1,x2,y3,x3,y3)

for(i in 1:30){
    result[[i]]  <- sqrt(x`i' + y`i')
}

我能做什么?

【问题讨论】:

  • 您尝试做的事情很困难,因为您错误地创建了 60 个独立的、独立的变量,而不是将它们放在像列表或矩阵这样的单个数据结构中。例如,一个两列矩阵,或一个长度为 2 的向量列表。
  • 是的,我在描述里改了!对不清楚的地方深表歉意!
  • 对于您正在尝试做的事情来说,这仍然是一个相当尴尬的数据结构。尽管如此,至少可以通过将列名粘贴在一起来进行子集化。即类似matrix[,paste0("x",i)].
  • 你能提供一个你的矩阵的例子吗?
  • 给你,只是简单的变量,但它最多可达 30

标签: r loops variables names


【解决方案1】:

这是一个示例矩阵:

dat <- matrix(1:300, ncol = 60)
colnames(dat) <- paste0(rep(c("x", "y"), 30), rep(1:30, each = 2))

这是一个解决方案:

for (i in 1:30) {
  assign(paste0("result", i), sqrt( dat[, paste0("x", i)] + dat[, paste0("y", i)] ) )
  dat <- cbind(dat, get(paste0("result", i)))
}
colnames(dat)[61:90] <- paste0("result", 1:30)

【讨论】:

    【解决方案2】:

    我不确定最初的问题是什么样的,但您的代码现在看起来不错,只是您需要使用 paste() 来构造变量名并使用 get() 来获取它们。

     for(i in 1:30){
        result[[i]]  <- sqrt(get(paste('x',i,sep='')) + get(paste('y',i,sep='')))
     }
    

    【讨论】:

      【解决方案3】:

      好的,这种格式有点尴尬,但仍然可以处理。我们查找名称中包含当前 'i' 的列名,并计算其总和的 sqrt。

      result <- vector()
      for (i in 1:3){
        result[i] <- sqrt(sum(matrix[,which(grepl(i,colnames(matrix)))]))
      }
      

      使用您的数据给出:

      > result
      [1] 7.348469 7.615773 7.549834
      

      【讨论】:

        猜你喜欢
        • 2019-02-03
        • 2015-08-10
        • 1970-01-01
        • 2018-12-07
        • 2019-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多