2014-08-27 2 views
1

Я хочу сделать следующее. Я вычисляю остаток от общего количества строк в наборе данных, деленный на 20, и на основе остатка (0,1,2, ... 19) Я назначаю значение x1, x2, x3 и т. Д. Переменной, называемой blf. Например, если остаток n-й строки & 20 равен 0, тогда blf = 0,8, если остаток n-й строки & 20 равен 1, тогда blf = 0,7, если остаток n-й строки и 20 равен 2 или 3, тогда blf = 0,6 и так далее. Когда я делаю это в R (Мой код ниже и образец набора данных можно найти здесь (как RDATA и CSV): http://goo.gl/qgbeIJ) я получаю следующее сообщение об ошибке:Назначить значение на основе остатка строки

Error in ifelse(sampledat[1:nrow(sampledat)%%20 == 0], 0.8, blf) : (list) object cannot be coerced to type 'logical'

sampledat$blf <- 0.1 
sampledat$blf <- with(sampledat, ifelse(sampledat[1:nrow(sampledat)%%20==0],0.8,blf)) 
sampledat$blf <- with(sampledat, ifelse(sampledat[1:nrow(sampledat)%%20==1],0.7,blf)) 
sampledat$blf <- with(sampledat, ifelse(sampledat[1:nrow(sampledat)%%20==2] | sampledat[1:nrow(sampledat)%%20==3] ,0.6,blf)) 

Одно из возможных решений для хранения остатков в виде отдельной переменной с именем осталось, а затем, основываясь на значении вектора, выполните мои операции ifelse, но мне интересно, есть ли способ сделать это за один шаг.

sampledat$remain <- (1:nrow(sampledat))%%20 
sampledat$blf <- 0.1 
sampledat$blf <- with(sampledat, ifelse(remain==0,0.8,blf)) 
sampledat$blf <- with(sampledat, ifelse(remain==1,0.7,blf)) 
sampledat$blf <- with(sampledat, ifelse(remain==2 | remain==3 ,0.6,blf)) 

Любые идеи были бы оценены.

ТИА, Кришнан

+1

По крайней мере, если 'stay' никогда не превышает 3, вставьте свое' if-else' и назначьте все случаи, которые не равны 0 или 1, к окончательному значению. Я также не думаю, что вам нужно 'с' - просто что-то вроде' sampledat $ blf <- 0.6 + 0.1 * (sampledat $ оставаться == 1) + 0.2 * (sampledat $ оставаться == 0) ' –

+0

Что произойдет, если остаток больше 3? –

+1

Тот же процесс продолжается с разными значениями, назначенными blf на основе остатка до 19, и он повторяется для всех записей в таблице данных. Для краткости не было всего остального = 19. – Krishnan

ответ

2

Вы не сказали, что должно произойти после того, как в остатке 3, так что я использовал 0.0. Я сделал это в двухэтапном (вроде) легко понятном процессе:

answers=c(0.8,0.7,0.6,0.6,0.0, 
     0.0,0.0,0.0,0.0,0.0, 
     0.0,0.0,0.0,0.0,0.0, 
     0.0,0.0,0.0,0.0,0.0) 

sampledata$blf<-answers[(as.numeric(rownames(sampledata))%%20)+1] 

Вы можете изменить массив ответов по мере необходимости.

+0

Это решение работает отлично. Большое спасибо Андрею. – Krishnan