Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将平均值中的未完成值替换为NA_R - Fatal编程技术网

R 将平均值中的未完成值替换为NA

R 将平均值中的未完成值替换为NA,r,R,我想从我的数据中获取每一行的平均值,并找出每一行中的每个值离平均值有多远。如果百分比高于50,则该值应替换为NA 这就是数据: structure(list(Name = structure(c(18L, 19L, 5L, 13L, 14L, 31L ), .Label = c("AMC Javelin", "Cadillac Fleetwood", "Camaro Z28", "Chrysler Imperial", "Datsun 710", "Dodge Challenger", "Du

我想从我的数据中获取每一行的平均值,并找出每一行中的每个值离平均值有多远。如果百分比高于50,则该值应替换为
NA

这就是数据:

structure(list(Name = structure(c(18L, 19L, 5L, 13L, 14L, 31L
), .Label = c("AMC Javelin", "Cadillac Fleetwood", "Camaro Z28", 
"Chrysler Imperial", "Datsun 710", "Dodge Challenger", "Duster 360", 
"Ferrari Dino", "Fiat 128", "Fiat X1-9", "Ford Pantera L", "Honda Civic", 
"Hornet 4 Drive", "Hornet Sportabout", "Lincoln Continental", 
"Lotus Europa", "Maserati Bora", "Mazda RX4", "Mazda RX4 Wag", 
"Merc 230", "Merc 240D", "Merc 280", "Merc 280C", "Merc 450SE", 
"Merc 450SL", "Merc 450SLC", "Pontiac Firebird", "Porsche 914-2", 
"Toyota Corolla", "Toyota Corona", "Valiant", "Volvo 142E"), class = "factor"), 
    mpg_1 = c(125, 133, 143, 141, 134, 238), cyl_1 = c(114, 153, 
    112, 136, 128, 155), disp_1 = c(113, 143, 144, 131, 431, 
    331), hp_1 = c(332, 221, 113, 331, 134, 151)), .Names = c("Name", 
"mpg_1", "cyl_1", "disp_1", "hp_1"), row.names = c(NA, 6L), class = "data.frame")
这就是期望的输出:

               Name mpg_1 cyl_1 disp_1 hp_1
1         Mazda RX4   125   114    113  NA
2     Mazda RX4 Wag   133   153    143  221
3        Datsun 710   143   112    144  113
4    Hornet 4 Drive   141   136    131  NA
5 Hornet Sportabout   134   128    NA   134
6           Valiant   238   155    331  151
还有两个条件

  • 行中只有一个未完成的值可以替换为
    NA
    。很难相信使用50%截止值会有两个值,因为平均值会完全改变,但看看第二个条件
  • 如果截止百分比很容易修改,那就太好了。我把价格降到50%以下

  • 你知道如何有效地做这件事吗?使用循环看起来是可行的,但也许有更有效的方法?

    从统计角度来看,正如@Roland在评论中提到的,不建议这样做。但是如果你一定要这么做的话

    fun1 <- function(x, n){
      t <- which((x - mean(x))/mean(x) > n)[1]
      x[t] <- NA
      return(x)
    }
    
    df1[-1] <- t(apply(df1[-1], 1, fun1, 0.5))
    
    df1
    #               Name mpg_1 cyl_1 disp_1 hp_1
    #1         Mazda RX4   125   114    113   NA
    #2     Mazda RX4 Wag   133   153    143  221
    #3        Datsun 710   143   112    144  113
    #4    Hornet 4 Drive   141   136    131   NA
    #5 Hornet Sportabout   134   128     NA  134
    #6           Valiant   238   155     NA  151
    

    fun1从统计角度来看,这是一个非常糟糕的想法。但是,您可以通过编写一个函数,对输入向量执行此操作,然后使用
    apply
    @Shaxi-Liver轻松做到这一点。如果您只想更改每行一个值,并且截止阈值可以是可变的,为什么不将与平均值偏差最大的值设置为
    NA
    ?值得一提的是,我同意罗兰的观点,从统计学的角度来看,这不是一个好主意。在我的具体情况下,可以使用什么统计方法?你能推荐一些测试吗?问题是复制的数量(4)。我“知道”一些结果在统计学上应该是相关的,但由于一次重复,p值通常高于阈值。首先,我想测试当我从数据中删除这些异常值时,情况是怎样的。如果我能看到我的“期望”,我会尝试找到一种统计方法。如果结果仍然不清楚,我将重复整个实验,这是一年的工作。我只是想补充一点,我已经在不同的论坛上寻求帮助,以找到一种正确的方法来分析我的数据。不幸的是,我没有统计学家的任何支持,我在这个领域的知识也有限。我确实在这个链接下解释了这个问题:@ShaxiLiver如果你不想要你所描述的东西,你想要统计建议,那么就把它发布在Cross Validated上。然而,如果你在这里发布一个关于编程的问题,请确保这正是你想要做的,然后再要求人们花时间回答你的问题。