簡體   English   中英

順序重命名列數據幀

[英]Rename column data frame sequentially

我有一個這樣的數據框

   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不同於1。

可以使用函數na.locf() ASTöbservationÇarried˚Forward)在包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

使用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

所以你有這個:

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

您可以通過df[1,]<- as.numeric(df[1,])將其轉換為整數,然后開始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循環,但是我想指出如何管理string的df以將其轉換為數字以應用它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM