2015-12-31 2 views
0

Я нуждаясь, чтобы добавить столбец к dataframe, который отмечает «X», если столбец 1 больше 0 и столбец 1 предыдущего ряда был меньше 0.Добавить Условный вычисляемого столбца в R Dataframe

Поэтому, учитывая :

c1 = c(0,1,-1,1,2,0,1)

testdf <- data.frame(c1)

Я хотел бы добавить столбец "новый" в testdf как:

| c1 | new | 

+----+-----+ 

| 0 |  | 

| 1 |  | 

| -1 |  | 

| 1 | X | 

| 2 |  | 

| 0 |  | 

| 1 |  | 

Я считаю, что это будет необходимо использование shift(), что я понимаю, достаточно, чтобы создать подмножество с помощью команды subsetdf <- subset(testdf,c1>0 & shift(c1,1)<0)

ответ

1

Мы можем попробовать

i1 <- with(testdf, c(FALSE,c1[-1] >0 & c1[-length(c1)] < 0)) 
testdf$new <- ifelse(i1, 'X', '') 
testdf$new 
#[1] "" "" "" "X" "" "" "" 

Или с помощью dplyr

library(dplyr) 
testdf %>% 
     mutate(new=c("", "X")[(c1>0 & lag(c1)< 0)+1L]) 

В вызове mutate мы также можем использовать ifelse a с в другом посте.

0

Если вы сделали хотите использовать shift от data.table, вы могли бы идти об этом так:

library(data.table) 
testdf$c1_lag <- shift(testdf$c1, n=1L) 
testdf$new <- ifelse(testdf$c1 > 0 & testdf$c1_lag < 0, "X", "") 
testdf 
# c1 c1_lag new 
# 1 0  NA  
# 2 1  0  
# 3 -1  1  
# 4 1  -1 X 
# 5 2  1  
# 6 0  2  
# 7 1  0  
0

Легко сделать такую ​​мутацию колонку с dplyr пакета и лаг оператора следующим образом:

library(dplyr) 
testdf <- testdf %>% mutate(new = ifelse(c1 > 0 & lag(c1) < 0, 'X', '')) 
+0

I отправлен точно в одно и то же время. Кроме того, мне нравится мой лучше для интуитивного ifelse() и подмножества catenated vector. – Gopala

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