由于不需要的因素而改变代码

时间:2013-03-30 14:04:07

标签: r

所以基本上我上面的代码只需要每5个数字并计算每第5个数字的值的标准偏差....所以如果我有这样的样本数据

Number  STD
1   11.15
2   11.18
3   11.21
4   11.24
5   11.3
10  11.36
11  11.42
12  11.48
13  11.54
14  11.6
15  11.66
16  11.72
17  11.78
18  11.84
19  11.9
20  11.96

当我运行我的代码时,我会得到这个输出

 Number        STD
1      1 0.05770615
2      2         NA
3      3 0.09486833
4      4 0.09486833

所以我想做的就是用NA简单地替换0。而不是得到像1,2,3,4等因素...我想得到5,10,15,20,25等......

3 个答案:

答案 0 :(得分:1)

我没有尝试重写您尝试做的事情,但为了保持连续性,您可以

  1. 您可以使用labels的参数cut来设置标签结果类别。
  2. 使用spread[is.na(spread)] <- 0
  3. 将NA更改为0

    所有代码是:

    hunter <- lapply(hunt, function(i) {  
      random <- cut(value[,i],seq(0,max(value[i]),5),
                    labels=seq(5,max(value[i]),5))
      spread<-tapply(value[,i+1],random, sd,na.rm=TRUE)
      spread[is.na(spread)] <- 0
      Number<-levels(as.factor(random))
      d <- data.frame(Number=Number,STD=spread)
      })
    
      Number        STD
    5       5 0.05770615
    10     10 0.00000000
    15     15 0.09486833
    20     20 0.09486833
    

答案 1 :(得分:1)

另一种方法:

# Generate data
number <- c(1:5, 10:20)
val <- c(11.15, 11.18, 11.21, 11.24, 11.30, 11.36, 11.42,
  11.48, 11.54, 11.60, 11.66, 11.72, 11.78, 11.84, 11.90, 11.96)

data <- data.frame(number, val)


# Calculate SD
breaks <- seq(0, 20, 5)
splitted.data <- split(data$val, f=cut(data$number, breaks, labels=F))
err <- sapply(splitted.data, sd)
err[is.na(err)] <- 0
res <- cbind(Number = breaks[-1], STD = err)

导致:

> res
  Number        STD
1      5 0.05770615
2     10 0.00000000
3     15 0.09486833
4     20 0.09486833

答案 2 :(得分:1)

使用data.table包,您可以在一次调用中完成此操作:

 library(data.table)
 DT <- data.table(value)

作为sigle电话:

DT[, list(SD = ifelse(is.na(sd(STD)), 0, sd(STD))) 
   , by=list("Group" = factor(G <- (Number-1) %/% 5, labels=(unique(G) + 1)*5))]

   Group         SD
1:     5 0.05770615
2:    10 0.00000000
3:    15 0.09486833
4:    20 0.09486833

打破它:

# you can create your groupings by 
(Number-1) %/% 5  # (ie, the remainder when divided by 5)

# you can create your factor levels by 
5 * ((Number-1) %/% 5 + 1)

# calculate the Group:
DT[, grp := factor(G <- (Number-1) %/% 5, labels=(unique(G) + 1)*5)]

# calculate the SD by Group, replacing NA's with 0:
DT[, SD := ifelse(is.na(sd(STD)), 0, sd(STD)), by=grp]
unique(DT[, list(grp, SD)])