记一个R语言错误

2021-04-30 11:48:15 浏览数 (1)

发现如果习惯了一个编程语言,想当然的往另一个上套,是要吃大亏的,这是一个真实的经历。我最早学的Python,习惯了它的英语化编程,到了最近操作表的多了起来,发现R语言更顺手些,就转向了R语言,一直用得还不错,属于不求效率,只求能解决问题的主,不过,今天发现的程序bug,令我汗颜了一波。详细如下:

R中的实现

先来看R语言的代码,一个for循环,两三行,如此简单,就出了个大毛病:

代码语言:javascript复制
   for (i in 1:length(rownames(T_P))) {
     T_P$Median[i] <- mean(as.numeric(T_P[i,]))
   }
# 数据在这里:
                  AL      DH     RN
En3 1.87694501 1.58559653 1.32844769
En8 1.76545633 1.49141366 1.24953920
En9 1.09405837 0.92423334 0.77434304

各位能发现问题出在哪吗?就出在这个赋值操作上,重要的问题说3遍,R语言是向量化的R语言是向量化的R语言是向量化的。这个循环中第一个赋值就把一列给赋值了,所以计算就不会正确了,除了第一个结果。看看错误的结果:

代码语言:javascript复制
# 运行第一个时的结果
                   AL      DH     RN  Median
En3 1.87694501 1.58559653 1.32844769  1.59699641
En8 1.76545633 1.49141366 1.24953920  1.59699641
En9 1.09405837 0.92423334 0.77434304  1.59699641
# 运行完成后
                   AL      DH     RN
En3 1.87694501 1.58559653 1.32844769 1.59699641
En8 1.76545633 1.49141366 1.24953920 1.52585140
En9 1.09405837 0.92423334 0.77434304 1.09740779

正确操作

当然我这代码不是最优的,解决问题是第一要务,优化第二,很多时候优化就省略了,如果没有速度上需求,特别是数据量比较小的情况。

代码语言:javascript复制
    Median <- c() 
    for (i in 1:length(rownames(T_P))) {
      Median <- c(Median, mean(as.numeric(T_P[i,])))
    }
    T_P <- cbind(T_P, Median)

0 人点赞