2016-07-25 141 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? –