R:基于递增列为数据帧分配唯一ID

时间:2015-02-16 05:21:26

标签: r

我的动机是分割这个数据框,这样每个分割都以"开始"以"结束"结束。

Input Format :
> df
   sampleData proc_id
1       begin       0
2         mid       0
3         mid       0
4         mid       0
5         mid       0
6         end       0
7       begin       0
8         mid       0
9         mid       0
10        mid       0
11        mid       0
12        mid       0
13        mid       0
14        end       0
15      begin       0
16        mid       0
17        mid       0
18        mid       0
19        mid       0
20        end       0

> df$proc_id[1:6]<-1
> df$proc_id[7:14]<-2
> df$proc_id[15:20]<-3

Output Format:
> df
   sampleData proc_id
1       begin       1
2         mid       1
3         mid       1
4         mid       1
5         mid       1
6         end       1
7       begin       2
8         mid       2
9         mid       2
10        mid       2
11        mid       2
12        mid       2
13        mid       2
14        end       2
15      begin       3
16        mid       3
17        mid       3
18        mid       3
19        mid       3
20        end       3     

我一直在考虑,编写for循环,并将process_id(开始,中间,结束为其阶段)分配给数据帧的每一行。然后对此process_id进行拆分会将每个进程分成一个单独的数据框。

我能做的另一种方法是,获得所有&#34;开始&#34;项目。然后传递它,作为apply()调用中使用的函数的额外参数。

任何人都可以建议我一个更好的方法,因为我是R的新手。 如果有包装来实现它,请同样告诉我。

由于

2 个答案:

答案 0 :(得分:1)

您可以在使用此代码之前搜索所有“结束”的“开始”。

begins <- which(df$sampleData=="begin")
ends <- which(df$sampleData=="end") +1 # add one to end indexes to see if they contain a "begin"

#find the intersection
inter <- intersect(begins, ends)

proc_id <- do.call(function(x)rep(x, inter[x]), list( seq_along(inter) ))

答案 1 :(得分:0)

感谢asmohamed,为解决方案。 但我不得不调整你的解决方案,以获得所需的输出。这是最终的解决方案:

> df$proc_id<-0
> begins <- which(df$sampleData=="begin")
> ends <- which(df$sampleData=="end") +1
> inter <- intersect(begins, ends)
> inter<-c(1,inter,length(df$sampleData)+1)
> df$proc_id <- do.call(function(x)rep(x-1, inter[x]-inter[x-1]), list(2:length(inter) ))