将条件计算列添加到R Dataframe

时间:2015-12-31 17:39:47

标签: r

如果第1列大于0且前一行的第1列小于0,我需要在数据框中添加一列标记“X”。

所以给出:

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

testdf <- data.frame(c1)

我想将“new”列添加到testdf中:

| c1 | new |

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

|  0 |     |

|  1 |     |

| -1 |     |

|  1 | X   |

|  2 |     |

|  0 |     |

|  1 |     |

我相信它需要使用shift(),我完全理解使用命令subsetdf <- subset(testdf,c1>0 & shift(c1,1)<0)

创建子集

3 个答案:

答案 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

答案 1 :(得分: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    

答案 2 :(得分:0)

使用dplyr包和滞后算子很容易进行这样的列变异,如下所示:

// 7/1/2005 => 07/01/2005
m.DATE_FIELD.ToString().ToUpper() == searchCriteria.TrimStart('0').ToUpper()+" 12:00:00 AM"