【问题标题】:'names' attribute [21] must be the same length as the vector [5].What does it mean and why am I getting this?'names' 属性 [21] 必须与向量 [5] 的长度相同。这是什么意思,为什么我会得到这个?
【发布时间】:2019-10-10 05:52:42
【问题描述】:

在尝试重命名列时,我尝试了两种方法。一种有效,另一种则出错:-

     for(i in datalist)
   {
  print (i)
}

i=0:4
l1=list(1+5*i)
l1
l2=list(l1[[1]]+1)
l2
l3=list(l2[[1]]+1)
l3
l4=list(l3[[1]]+1)
l4
l5=list(l4[[1]]+1)
l5

df<-data.frame(a=l1,b=l2,c=l3,d=l4,e=l5)
df
for(i in 1:ncol(df))#Approach 1 which worked out successfully
  colnames(df)[i]=paste(c("x"),i,sep="")

for(i in df)#Approach 2 which threw an error
{
  colnames(df)[i]=paste(c("x"),i,sep="")
}

The correct output from approach 1-
x1 x2 x3 x4 x5
1  1  2  3  4  5
2  6  7  8  9 10
3 11 12 13 14 15
4 16 17 18 19 20
5 21 22 23 24 25

方法 2 的错误 - 名称错误(x)

【问题讨论】:

  • 为什么你需要一个循环呢?可以直接names(df) &lt;- paste0("x", seq_along(df))

标签: r list dataframe for-loop


【解决方案1】:

语法for (i in df) 将迭代数据框本身的列。但是,您的第一个版本(迭代列数的索引)正是您想要的,因为您需要访问数据框的第 i 列。

请注意,由于 paste() 函数是矢量化的,因此您甚至可以轻松完成您想要的操作,甚至无需使用循环:

names(df) <- paste0("x", seq_along(df))

【讨论】:

    【解决方案2】:

    我们在同一页面上,我也在学习这一点。我可能没有一个好的答案。但这是我为了解正在发生的事情所做的。

    首先,我会尝试弄清楚i 在您的循环中的含义。

    k = 1
    for(i in df ){
      print(paste("loop", k))
      print(i)
      k = k + 1
    }
    

    你会得到:

    [1] "loop 1"
    [1]  1  6 11 16 21
    [1] "loop 2"
    [1]  2  7 12 17 22
    [1] "loop 3"
    [1]  3  8 13 18 23
    [1] "loop 4"
    [1]  4  9 14 19 24
    [1] "loop 5"
    [1]  5 10 15 20 25
    
    

    然后,将代码中的i 替换为loop 1 值作为向量:c(1, 6, 11, 16, 21)

    colnames(df)[c(1,  6, 11, 16, 21)] = paste(c("x"),c(1,  6, 11, 16, 21), sep = "")
    
    

    那么,你得到:

    > colnames(df)[c(1,  6, 11, 16, 21)]=paste(c("x"),c(1,  6, 11, 16, 21),sep="")
    Error in names(x) <- value : 
      'names' attribute [21] must be the same length as the vector [5]
    

    现在,我们知道21 的来源。但是,您没有 21 列,而只有 5 个名称。

    【讨论】:

      【解决方案3】:

      #Approach 2 的问题在于它逐列而不是列迭代数据框的值。我们可以通过打印值来检查

      for(i in df) {
          print(i)
      }
      
      #[1]  1  6 11 16 21
      #[1]  2  7 12 17 22
      #[1]  3  8 13 18 23
      #[1]  4  9 14 19 24
      #[1]  5 10 15 20 25
      

      所以在第一次迭代中你正在做的是

      colnames(df)[c(1, 6, 11, 16, 21)] = paste(c("x"),c(1, 6, 11, 16, 21),sep="")
      

      返回与您收到的相同的错误。

      名称错误(x)

      如果您像第一次尝试或

      那样迭代列,您的 for 循环将起作用
      for(i in seq_along(df)) {
         colnames(df)[i]=paste(c("x"),i,sep="")
      }
      

      但是,要重命名列不需要使用for循环,你可以直接这样做

      names(df) <- paste0("x", seq_along(df))
      #OR
      #colnames(df) <- paste0("x", 1:ncol(df))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-26
        • 2020-01-04
        • 1970-01-01
        • 2019-06-12
        • 2019-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多