2014-01-22 5 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 

, где второй столбец у = as.numeric (as.character (х)), а третий г = Diff (у) , Что я хотел бы сделать, это добавить колонку, как это

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 

т.е. если г = 1 Xnew равен предыдущему х, для которых г отличается от единицы.

+0

Я не понимаю вопрос, у вас есть dataframe с числами и хотите иметь разницу с предыдущим номером во втором столбце, а затем сделать третий столбец, где, если разница меньше или равна 1, вы сохраняете предыдущий номер? – Llopis

+0

Не предыдущее число, а последнее число, для которого разница отличается от одного – user3036416

ответ

5

Вы можете использовать функцию na.locf() (л аст о bservation с осуществляется для е orward) в пакете zoo:

Во-первых, импортировать данные:

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 perfect !!! – 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, но я хотел бы указать, как управлять ФР строки, чтобы преобразовать его в номер, чтобы применить его

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