2015-06-27 25 views
1

喜相對於更換行了這裏的問題: [Dynamically replace row in dataframe with vector在數據幀與狀態

我有例如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) 

現在我要帶一個排,爲例如第一個(1a)和:

從該行獲取最小值和最大值。在這種情況下,min = 2和max = 9(注意在中間缺少值,例如該行中沒有5,7或8)。

現在我想用所有缺少的值替換該行並對其進行擴展(該行將比所有其他行更長,因爲它將從2到9(2,3,4,5,6,7,8, 。9)整個data.frame然後應自動NA列對於不是隻要一個I替換其他行擴展

現在下面的代碼並實現這一點:

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) { 
    d <- cbind(d, replicate(num.add, rep(NA, nrow(d)))) 
} else if (num.add <= 0) { 
    new.row <- c(new.row, rep(NA, -num.add)) 
} 

並最終將擴展data.frame標題重命名爲默認值:

d[row.to.change,c(-1, -2)] <- new.row 
colnames(d) <- paste0("V", seq_len(ncol(d))) 

現在:這對我在row.to.replace中指定的行起作用,但是如何工作,例如我想讓它適用於第二列有'b'的所有行?像這樣:「做這個地方D $ V2 =='B'」?如果data.frame長度爲5000行。

回答

0

你已經解決了。只需創建一個函數,然後將其應用於每行數據。

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 
+0

這將做到所有的行,但我希望它僅用於例如列V2中有'b'的行。 –

+0

在應用'rtc'之前驗證所需的條件。請參閱評論編輯。 – Robert