2

所以基本上我上面的代码只取每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

所以我想做的就是简单地NA0. 也不是得到像 1,2,3,4 等因素......我想得到 5,10,15,20,25 等......

4

3 回答 3

1

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

  1. 您可以使用参数labelsofcut来设置标签结果类别。
  2. 使用将 NA 更改为 0spread[is.na(spread)] <- 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
于 2013-03-30T14:21:51.463 回答
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
于 2013-03-30T14:25:51.250 回答
1

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

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

作为一个单一的电话:

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)])
于 2013-03-30T15:27:05.057 回答