用条件替换dataframe中的行

用条件替换dataframe中的行,r,dataframe,rstudio,R,Dataframe,Rstudio,您好,关于这里的问题: [ 我有一个data.frame,例如: d <- read.table(text=' V1 V2 V3 V4 V5 V6 V7 1 1 a 2 3 4 9 6 2 1 b 2 2 4 5 NA 3 1 c 1 3 4 5 8 4 1 d 1 2 3 6 9 5 2 a 1 2 3 4 5 6 2 b 1 4 5 6 7 7 2 c 1 2 3 5 8 8 2 d 2 3 6 7 9', header=TRUE) d您已经解决了。只需创建一个函数,然

您好,关于这里的问题: [

我有一个data.frame,例如:

d <- read.table(text='   V1 V2  V3  V4  V5  V6  V7
1 1 a 2 3 4 9 6
2 1 b 2 2 4 5 NA
3 1 c 1 3 4 5 8
4 1 d 1 2 3 6 9
5 2 a 1 2 3 4 5
6 2 b 1 4 5 6 7
7 2 c 1 2 3 5 8
8 2 d 2 3 6 7 9', header=TRUE)

d您已经解决了。只需创建一个函数,然后将其应用于数据的每一行

rtc=function(row.to.change){# <- 1
(new.row <- seq(min(d[row.to.change,c(-1, -2)], na.rm=TRUE), max(d[row.to.change,c(-1,-2)], na.rm=TRUE)))
(num.add <- length(new.row) - ncol(d) + 2)
# [1] 3
if (num.add <= 0) {
  new.row <- c(new.row, rep(NA, -num.add))
}
new.row
}

#d2=d

newr=lapply(1:nrow(d),rtc) # for the hole data
# for specific condition, like lines with "b" in V2 change to:
# newr=lapply(1:nrow(d),function(z)if(d$V2[z]=="b")rtc(z) else as.numeric(d[z,c(-1, -2)])) 
mxl=max(sapply(newr,length))
newr=lapply(newr,function(z)if(length(z)<mxl)c(z,rep(NA,mxl-length(z))) else z)
if (ncol(d)-2 < mxl) {
  d <- cbind(d, replicate(mxl-ncol(d)+2, rep(NA, nrow(d))))
}
d[,c(-1, -2)] <- do.call(rbind,newr)
colnames(d) <- paste0("V", seq_len(ncol(d)))

d

  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
1  1  a  2  3  4  5  6  7  8   9  NA
2  1  b  2  3  4  5 NA NA NA  NA  NA
3  1  c  1  2  3  4  5  6  7   8  NA
4  1  d  1  2  3  4  5  6  7   8   9
5  2  a  1  2  3  4  5 NA NA  NA  NA
6  2  b  1  2  3  4  5  6  7  NA  NA
7  2  c  1  2  3  4  5  6  7   8  NA
8  2  d  2  3  4  5  6  7  8   9  NA

rtc=function(row.to.change){#您已经解决了。只需创建一个函数,然后将其应用于数据的每一行

rtc=function(row.to.change){# <- 1
(new.row <- seq(min(d[row.to.change,c(-1, -2)], na.rm=TRUE), max(d[row.to.change,c(-1,-2)], na.rm=TRUE)))
(num.add <- length(new.row) - ncol(d) + 2)
# [1] 3
if (num.add <= 0) {
  new.row <- c(new.row, rep(NA, -num.add))
}
new.row
}

#d2=d

newr=lapply(1:nrow(d),rtc) # for the hole data
# for specific condition, like lines with "b" in V2 change to:
# newr=lapply(1:nrow(d),function(z)if(d$V2[z]=="b")rtc(z) else as.numeric(d[z,c(-1, -2)])) 
mxl=max(sapply(newr,length))
newr=lapply(newr,function(z)if(length(z)<mxl)c(z,rep(NA,mxl-length(z))) else z)
if (ncol(d)-2 < mxl) {
  d <- cbind(d, replicate(mxl-ncol(d)+2, rep(NA, nrow(d))))
}
d[,c(-1, -2)] <- do.call(rbind,newr)
colnames(d) <- paste0("V", seq_len(ncol(d)))

d

  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
1  1  a  2  3  4  5  6  7  8   9  NA
2  1  b  2  3  4  5 NA NA NA  NA  NA
3  1  c  1  2  3  4  5  6  7   8  NA
4  1  d  1  2  3  4  5  6  7   8   9
5  2  a  1  2  3  4  5 NA NA  NA  NA
6  2  b  1  2  3  4  5  6  7  NA  NA
7  2  c  1  2  3  4  5  6  7   8  NA
8  2  d  2  3  4  5  6  7  8   9  NA

rtc=函数(行到更改){#这将对所有行执行此操作,但我希望仅对V2列中有“b”的行执行此操作。在应用
rtc
之前验证所需条件。请参阅注释编辑。这将对所有行执行此操作,但我希望仅对V2列中有“b”的行执行此操作。验证所需条件b在应用
rtc
之前。请参阅注释编辑。
rtc=function(row.to.change){# <- 1
(new.row <- seq(min(d[row.to.change,c(-1, -2)], na.rm=TRUE), max(d[row.to.change,c(-1,-2)], na.rm=TRUE)))
(num.add <- length(new.row) - ncol(d) + 2)
# [1] 3
if (num.add <= 0) {
  new.row <- c(new.row, rep(NA, -num.add))
}
new.row
}

#d2=d

newr=lapply(1:nrow(d),rtc) # for the hole data
# for specific condition, like lines with "b" in V2 change to:
# newr=lapply(1:nrow(d),function(z)if(d$V2[z]=="b")rtc(z) else as.numeric(d[z,c(-1, -2)])) 
mxl=max(sapply(newr,length))
newr=lapply(newr,function(z)if(length(z)<mxl)c(z,rep(NA,mxl-length(z))) else z)
if (ncol(d)-2 < mxl) {
  d <- cbind(d, replicate(mxl-ncol(d)+2, rep(NA, nrow(d))))
}
d[,c(-1, -2)] <- do.call(rbind,newr)
colnames(d) <- paste0("V", seq_len(ncol(d)))

d

  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
1  1  a  2  3  4  5  6  7  8   9  NA
2  1  b  2  3  4  5 NA NA NA  NA  NA
3  1  c  1  2  3  4  5  6  7   8  NA
4  1  d  1  2  3  4  5  6  7   8   9
5  2  a  1  2  3  4  5 NA NA  NA  NA
6  2  b  1  2  3  4  5  6  7  NA  NA
7  2  c  1  2  3  4  5  6  7   8  NA
8  2  d  2  3  4  5  6  7  8   9  NA