2014-01-22 56 views
1

我有這樣重列數據幀依次

x   y   z 

10    10   0  
00021   21   11  
022   22   1           
13610206  13610206  1  
13610207  13610207  1  
13610208  13610208  1  
13610209  13610209  1  
13610210  13610210  1 

其中第二柱爲y = as.numeric的數據幀(as.character(X)),三是Z = DIFF(y)的。 我想要做的是增加一列這樣

x   y   z    xnew 

10    10   0    10 
00021   21   11    00021 
022   22   1    00021         
13610206  13610206  13610184   13610206 
13610207  13610207  1    13610206 
13610208  13610208  1    13610206 
13610209  13610209  1    13610206 
13610210  13610210  1    13610206 

即,如果Z = 1個xnew等於前一個x爲其中z是從一個不同的。

+0

我不明白問題是,你有一個有數字的數據框,並希望與第二列中的前一個數字有所不同,然後在第三列中如果差值小於或等於1,則保留前一個數字? – Llopis

+0

不是前一個號碼,而是最後一個不同的號碼 – user3036416

回答

5

可以在包zoo使用函數na.locf() AST ö bservation Ç arried ˚F orward):

首先,導入數據:

dat <- read.table(text=" 
x   y   z 
10    10   0  
00021   21   11  
022   22   1           
13610206  13610206  1  
13610207  13610207  1  
13610208  13610208  1  
13610209  13610209  1  
13610210  13610210  1 ", header=TRUE, colClasses=c("character", "numeric", "numeric")) 

接下來,分析

library(zoo) 

dat$z <- c(0, diff(dat$y)) 
dat$xnew <- na.locf(ifelse(dat$z==1, NA, dat$x)) 
dat 

結果:

  x  y  z  xnew 
1  10  10  0  10 
2 00021  21  11 00021 
3  022  22  1 00021 
4 13610206 13610206 13610184 13610206 
5 13610207 13610207  1 13610206 
6 13610208 13610208  1 13610206 
7 13610209 13610209  1 13610206 
8 13610210 13610210  1 13610206 
+0

+1對於locf完美! – PKumar

0

使用apply

old <- NA 
df$xnew <- apply(df, 1, function(row) { 
       if (row['z'] != "1") 
       old <<- row['x'] 
       old 
      }) 
df 
#   x  y  z  xnew 
# 1  10  10  0  10 
# 2 00021  21  11 00021 
# 3  022  22  1 00021 
# 4 13610206 13610206 13610184 13610206 
# 5 13610207 13610207  1 13610206 
# 6 13610208 13610208  1 13610206 
# 7 13610209 13610209  1 13610206 
# 8 13610210 13610210  1 13610206 
0

所以,你有這樣的:

df 
#   x 
#1  10 
#2 00021 
#3  022 
#4 13610206 
#5 13610207 
#6 13610208 
#7 13610209 
#8 13610210 

你可以將它通過df[1,]<- as.numeric(df[1,])轉換爲整數,然後開始休息值:

z<-0 
for (i in 0:nrow(df)){ 
z<-c(z,df[i+1,]-df[i,]) 
df<-cbind(df, z) 
} 

但Andrie解決方案是更好的,因爲它不使用for循環,但我想指出如何管理字符串的DF將其轉換爲數字應用它