我的动机是分割这个数据框,这样每个分割都以"开始"以"结束"结束。
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的新手。 如果有包装来实现它,请同样告诉我。
由于
答案 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) ))