2015-03-09 2 views
-3

У меня есть dataframe и хочу перекодировать дату, когда я могу сравнить эксперименты в будущем. Но он не работает, чтобы перекодировать дату с помощью if-statement. возможно, есть намек на это.инструкция ifelse не работает с датой

test <- data.frame(StartDate = c(rep("2015-02-16", 5), rep("2015-02-17", 5), rep("2015-02-23", 5), rep("2015-02-24", 5)), 
        response = sample(1:10,20,rep=TRUE)*7) 



test$StartDate <- strptime(test$StartDate, format="%F") 

test$day <- test$StartDate$mday 
test$experimentday <- ifelse((test$day == 16), 1, NA) 
test$experimentday <- ifelse((test$day == 17), 2, NA) 
test$experimentday <- ifelse((test$day == 23), 1, NA) 
test$experimentday <- ifelse((test$day == 24), 2, NA) 

    StartDate response day experimentday 
1 2015-02-16  35 16   NA 
2 2015-02-16  35 16   NA 
3 2015-02-16  63 16   NA 
4 2015-02-16  63 16   NA 
5 2015-02-16  21 16   NA 
6 2015-02-17  70 17   NA 
7 2015-02-17  42 17   NA 
8 2015-02-17  14 17   NA 
9 2015-02-17  42 17   NA 
10 2015-02-17  70 17   NA 
11 2015-02-23  49 23   NA 
12 2015-02-23  21 23   NA 
13 2015-02-23  42 23   NA 
14 2015-02-23  14 23   NA 
15 2015-02-23  21 23   NA 
16 2015-02-24  56 24    2 
17 2015-02-24  42 24    2 
18 2015-02-24  42 24    2 
19 2015-02-24  21 24    2 
20 2015-02-24  7 24    2 

Также другие варианты не работают

ifelse(test$day == 16, test$experimentday==1, test$experimentday==NA) 

if(test$day == 16) {test$experimentday2 <- 1} 
else {test$experimentday2 <- NA} 

if(test$day == 16) test$experimentday3 <- 1 
else test$experimentday3 <- NA 
+3

Хмм, что не работает? Возможно, вы хотите вложить 'ifelse' как ifelse ((test $ day == 16), 1, ifelse ((test $ day == 17), 2, NA)) 'или вместо этого использовать' switch'? – lukeA

+1

как @lukeA, вам следует попробовать: 'test $ experimentday <- sapply (as.character (test $ day), switch," 16 "= 1," 17 "= 2," 23 "= 1," 24 " = 2) 'или' test $ experimentday <- ifelse (тест $ day% in% c (16, 23), 1, ifelse (тест $ day% in% c (17, 24), 2, NA)) ' – Cath

ответ

2

Ваш код делает именно то, что вы сказать ему. Последняя строка кода,

устанавливает значения experimentday на 2, если day является 24, и устанавливает все другие значения experimentday в НС, эффективно отменяя работу ваших предыдущих строк кода. Возможно, вы захотите попробовать что-то вроде этого:

oldvalues <- c(16, 17, 23, 24) 
newvalues <- c(1, 2, 1, 2) 
test$experimentday <- newvalues[match(test$day, oldvalues)] 
+0

Благодарю. это хорошо работает. – Alexander

+0

Отлично. Примите ли вы это как ответ (щелкните галочку рядом с сообщением)? –

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