R:有条件地替换列值的快速方法

时间:2016-07-25 20:49:20

标签: r data.table dplyr

我有原始数据,每个单元的唯一标识符与时间混合到列中。为了总结'我需要将每组行的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 }}

1 个答案:

答案 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)]