2016-07-25 43 views
-2

我有原始數據,每個單元的唯一標識符與定時混合到列中。爲了「彙總」數據,我需要將每組行的uniqueID附加到列中。 我的循環的一部分已經修剪掉了上面的blurb,然後運行'ifelse'檢查文本,並取得該uniqueID,然後粘貼,直到遇到下一個文本字符串,然後重複。R:有條件替換列值的快速方法

它可以工作,但速度非常慢,我需要通過大量的原始數據重複它。 (我沒有訪問原始軟件來改變輸出文件的形狀。)

通過論壇的閱讀已經找到了替代with a single variable的解決方案,但我需要一種方法從一行中提取它DF。

例DF:

 time   dist  v3   v4 
1: 2    10.2  ...   .... 
2: 3    10.2  ...   .... 
3: Veh: 123  
4: 1    10.2  ...   .... 
5: 2    10.2  ...   .... 
6: 3    10.2  ...   .... 
7: Veh: 456 
8: 1    10.2  ...   .... 
9: 2    10.2  ...   .... 


v <- 0001 
for (m in 1:length(k2$time)) { 
if(grepl('Veh', k2$time[m])) {v <- strsplit(k2$time[m], split=":")[[1]][2]} else{ k2$time[m]<-v } 
           } 

通過運行它作爲一個循環,我知道它會工作下來列粘貼,直到它遇到另一個文本字符串。 看起來像這樣的理想結果。

 time   dist  v3   v4 
1: 0001   10.2  ...   .... 
2: 0001   10.2  ...   .... 
3: Veh: 123  
4: 123   10.2  ...   .... 
5: 123   10.2  ...   .... 
6: 123   10.2  ...   .... 
7: Veh: 456 
8: 456   10.2  ...   .... 
9: 456   10.2  ...   .... 

我再有一個貫穿全data.frame運行並刪除包含文本的行另一行,所以我可以

是任何人都知道一個更快的解決方案,或許用dplyr或data.frame總結?我放棄了922,000行代碼之前放棄了runthrough 15分鐘,我需要它運行數百萬次。

我正在用堆棧溢出的搜索組合。

使用上R-3.3.1


EDIT data.table-1.9.7和dplyr-0.5.0:道歉,可再現例如:

time <- c(1,2,"Veh: 123", 1:3,"Veh: 456", 1:3) 
dist <- c(1:2,"",4:6,"",8:10) 
v3 <- c(1:2,"",4:6,"",8:10) 
k <-data.frame(time,dist,v3) 
k$time <- as.character(k$time) 

v <- 0001 
for (m in 1:length(k$time)) { 
if(grepl('Veh', k$time[m])) {v <- strsplit(k$time[m], split=":")[[1]][2] }else{ k$time[m]<-v }} 
+1

提示:' grepl()'和'strsplit()'都是矢量化的。這就是我沒有可重複的例子所能做的。 –

+0

[使這是一個可重複的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – shayaa

回答

0
library(data.table) 
library(stringr) 
time <- c(1,2,"Veh: 123", 1:3,"Veh: 456", 1:3) 
dist <- c(1:2,"",4:6,"",8:10) 
v3 <- c(1:2,"",4:6,"",8:10) 
k <- data.table(time,dist,v3) 

v <- 0001 
k[,time := ifelse(grepl('Veh: \\d+', time), str_match(time, 'Veh: (\\d+)')[,2], v)] 
+0

你的'如果'的聲明是比我更整潔,但請參閱上面所需的示例輸出。如果沒有將vehID傳遞到下面的單元格中,則每次遇到新的'Veh:xxx'語句時更新它。 在R中這種操作是否有效?或者我的想法也是Excel-ish? –