2015-12-31 36 views
0

我需要添加列到如果列1大於0和前行的第1列是小於0添加條件計算的列於R數據框

所以,有了這標誌着「X」一個數據幀:

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一個在另一篇文章中。

0

如果你沒有從data.table想使用shift,你可以去了解這樣說:

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

我準確地在同一時間發佈。此外,我更喜歡我的直觀ifelse()與子集鏈接矢量。 – Gopala

相關問題