2013-03-30 2 views
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 

Так что я хочу сделать, это просто заменить NA с 0. Кроме того, вместо получения таких факторов, как 1,2,3,4 и т. Д., Я хочу получить 5,10,15,20,25 и т. Д.

+1

Я немного озадачен, как к чему вы хотите достичь ... не могли бы вы быть более ясными? Почему второе стандартное отклонение NA? В ваших данных нет недостающих точек ... – nico

+0

, потому что нет значений от 5 до 10 –

+0

ах, хорошо, я понимаю – nico

ответ

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 
1

Я не пытался переписать то, что вы пытаетесь делать, но только ради непрерывности можно

  1. вы можете использовать рассуждение labels из cut установить метки результирующие категории.
  2. Изменение NA до 0 с помощью spread[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 
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)]) 
Смежные вопросы