2016-07-25 2 views
-2

타이밍이있는 열에 혼합 된 각 장치의 고유 식별자가있는 원시 데이터가 있습니다. 데이터를 '요약'하려면 각 행 그룹에 대한 uniqueID를 열에 첨부해야합니다. 내 루프의 일부가 위의 선전에서 제거 된 다음 텍스트에 대해 'ifelse'검사를 실행하고 고유 ID를 얻기 위해 strsplit을 실행 한 후 다음 텍스트 문자열과 마주 칠 때까지 붙여넣고 반복합니다.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  ...   .... 
그때 내가

이 빠른 솔루션을 알고 사람이 아마도 dplyr 또는 data.frame을 사용하고 요약 할 수 있습니다 전체 data.frame 통해 실행 및 텍스트가 포함 된 행을 제거하는 또 다른 라인을 가지고

? 나는 922,000 라인의 코드를 돌파하기 전에 15 분을주고, 몇 백만을 돌파해야한다.

Stack Overflow에서 검색 조합이 부족합니다.

R-3.3.1


EDIT에 data.table-1.9.7 및 0.5.0-dplyr 사용 : 사과, 재현성 예 :

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

[재현 할 수있는 예] (0120-17753) – 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

'if'문은 내 것보다 더 정교합니다. 그러나 위의 예제 출력. vehicleID를 아래의 셀에 넣지 않으면 새로운 'Veh : xxx'문이 발생할 때마다 업데이트됩니다. R에서 효율적으로 이런 종류의 작업이 가능합니까? 아니면 내 생각도 Excel-ish입니까? –

관련 문제