2013-08-09 3 views
0

Вот небольшой пример кадра данных у меня есть:Как повторить часть строки в кадре данных

data <- data.frame(station=rep(c(1,1,2),each=4), month=rep(c(2,3,2),each=4), day=rep(c(26:29),3),times=rep(c(1:4),3),place=c(1:8,1:4),V1=rep(9:12,3),V2=rep(9:12,3)) 

И это кадр данных мне нужно:

data1 <- data.frame(station=rep(c(1,1,2),each=4), month=rep(c(2,3,2),each=4), day=rep(c(26:29),3),times=rep(c(1:4),3),place=c(1:8,1:4),V1=c(9,10,10,10,9:12,9,10,10,10),V2=c(9,10,10,10,9:12,9,10,10,10)) 

Что Мне нужно сделать, это повторить столбцы V1 и V2 от 28 февраля & 29 по 27 февраля, потому что исходные данные имеют 300 станций и 60 лет, я пробовал следовать, но не работает:

data1 <- ddply(data, .(station, month, times),function(x) x[x[3:4,2]==2,6:7] <- x[2,6:7]) 

Любой совет будет оценен, спасибо

+0

Итак, вы хотите, чтобы заменить значения эти даты со значением feb 27 – Metrics

+0

Можете ли вы, пожалуйста, переформулировать. Это не имеет никакого смысла. – mnel

+0

@Метрики, да, мне нужно только заменить 11,12 на 10, а остальные останутся – Rosa

ответ

0

Это по существу проблема с «последним наблюдением перенесена», и поэтому пакет zoo полезен. Установить все на 28 м или 29 февраля в НС, а затем переносить значения из 27 го использования na.locf

library(zoo) 
data[c("V1","V2")][data$day %in% c(28,29) & data$month %in% c(2),] <- NA 
keyvals <- data[c("V1","V2")][data$day %in% c(27,28,29) & data$month %in% c(2),] 
data[c("V1","V2")][data$day %in% c(27,28,29) & data$month %in% c(2),] <- na.locf(keyvals) 

Результат:

> data 
    station month day times place V1 V2 
1  1  2 26  1  1 9 9 
2  1  2 27  2  2 10 10 
3  1  2 28  3  3 10 10 
4  1  2 29  4  4 10 10 
5  1  3 26  1  5 9 9 
6  1  3 27  2  6 10 10 
7  1  3 28  3  7 11 11 
8  1  3 29  4  8 12 12 
9  2  2 26  1  1 9 9 
10  2  2 27  2  2 10 10 
11  2  2 28  3  3 10 10 
12  2  2 29  4  4 10 10 

> all.equal(data,data1) 
[1] TRUE 
+0

Ницца, как я забыл эту функцию, спасибо большое! – Rosa

0

Вот как вы это делаете. Если у вас есть много COLS, вы можете использовать lapply, но здесь я не использую, так как у вас есть только два COLS

data$V1[data[,3] %in% c(28,29) & data[,2] %in% c(2) ]<-data$V1[data[,3] %in% c(27) & data[,2] %in% c(2)] 
data$V2[data[,3] %in% c(28,29) & data[,2] %in% c(2) ]<-data$V2[data[,3] %in% c(27) & data[,2] %in% c(2)] 

Если вам нужно использовать несколько COLS, вот решение:

do.call(cbind,lapply(data[,6:7],function (x) {x[data[,3] %in% c(28,29) & data[,2] %in% c(2) ]<-x[data[,3] %in% c(27) & data[,2] %in% c(2)] 
               x}) 
     ) 
     V1 V2 
[1,] 9 9 
[2,] 10 10 
[3,] 10 10 
[4,] 10 10 
[5,] 9 9 
[6,] 10 10 
[7,] 11 11 
[8,] 12 12 
[9,] 9 9 
[10,] 10 10 
[11,] 10 10 
[12,] 10 10 

Примечание. Вместо данных [, 6: 7] вы можете выбрать cols, которые хотите заменить, все остальные остаются неизменными.

+0

, но мне нужны другие месяцы, чтобы сохранить одни и те же данные, и ваш код, сделанный 28 и 29 марта, тоже заменен. У меня еще 10 колонок – Rosa

+0

oops! будет редактировать – Metrics

+0

Функция lapply показывает ошибку: неожиданный символ – Rosa