[英]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.