我有原始数据,每个单元的唯一标识符与时间混合到列中。为了总结'我需要将每组行的uniqueID附加到列中的数据。 我的部分循环已经削减了上面的模糊,然后运行了一个' ifelse'检查文本,strsplit获取uniqueID,然后粘贴直到遇到下一个文本字符串,然后重复。
它有效,但它非常慢,我需要在很多原始数据上重复它。 (而且我无法访问原始软件来更改输出文件的形状。)
通过论坛阅读已找到替换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?我给了它15分钟,然后中止了超过922,000行代码,我需要它运行数百万。
我在Stack Overflow上耗尽了搜索组合。
在R-3.3.1上使用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 }}
答案 0 :(得分: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)]