2013-12-03 1 views
0

Я очень новичок в R и программировании и потратил много времени, пытаясь найти ответ на этот вопрос без успеха. Скорее всего, потому, что я плохо описываю проблему. Я пытаюсь создать кадр данных, в котором значения в одном векторе зависят от предыдущего элемента в том же столбце и значения элемента в той же позиции в другом столбце в кадре данных. Мой вывод должен выглядеть примерно так:Создание вектора в r на основе значений в другом векторе в dataframe

dates  month increase int_inc 
2010-01-01 1 1  1 
2010-02-01 2 1.03 1 
2010-03-01 3 1.061 1 
2010-04-01 4 1.093 1 
2010-05-01 5 1.126 1.03 
2010-06-01 6 1.159 1.03 
2010-07-01 7 1.194 1.03 
2010-08-01 8 1.23 1.03 
2010-09-01 9 1.267 1.03 
2010-10-01 10 1.305 1.03 
2010-11-01 11 1.344 1.03 
2010-12-01 12 1.384 1.03 
2011-01-01 1 1.426 1.03 
2011-02-01 2 1.469 1.03 
2011-03-01 3 1.513 1.03 
2011-04-01 4 1.558 1.03 
2011-05-01 5 1.605 1.061 
2011-06-01 6 1.653 1.061 
2011-07-01 7 1.702 1.061 
2011-08-01 8 1.754 1.061 
2011-09-01 9 1.806 1.061 
2011-10-01 10 1.86 1.061 
2011-11-01 11 1.916 1.061 
2011-12-01 12 1.974 1.061 

Мой код, чтобы создать этот кадр данных выглядит следующим образом:

dates <- c(seq(as.Date("2010-01-01"), as.Date("2012-01-01"), by = "+1 month")) 
month <- c(as.numeric(format(dates, "%m"))) 
data <- data.frame(dates, month) 
Len <- length(data$month)-1 
data$increase <- 1 * 1.03^(0:len) 

data$int_inc <- for (i in 1:Len) { 
+   data$int_inc[1] <- 1 
+   if (data$month == 5) { 
+   data$int_inc[i+1] <- data$int_inc[i] * 1.03 
+   } else { 
+   data$int_inc[i+1] <- data$int_inc[i] 
+  } 
+ } 

Я могу создать первые три столбца в dataframe с вышеприведенным кодом , Однако я не могу заполнить последний столбец (int_inc). Я получаю предупреждение, что «условие имеет длину> 1, и будет использоваться только первый элемент». Векторные данные $ int_inc имеют значение Null. В случае непонятности я пытаюсь увеличить значение int_inc на 3%, если значение месяца равно 5, в противном случае значение элемента равно значению предыдущего элемента.
Большое спасибо за вашу помощь.

+1

, не глядя слишком тщательно, вам нужно 'данные $ месяц [я] == 5'? –

ответ

2

Я бы объединить ifelse() и cumprod() к тому же эффект, как петли

month <- rep(1:12, 5) 
int_inc <- cumprod(ifelse(month == 5, 1.03, 1)) 
+0

Спасибо, Нил. Это отлично работает – user3063214

0
data$int_inc <- 1.03^(cumsum(month==5) ) 
+0

'1 *' ничего не делает. –

+0

Моя лень. Я только что изменил исходный код, который «пользователь» использовал для его «увеличения». –

Смежные вопросы