2014-10-08 97 views
0

我有一个data.frame,我想要找到列D或E中的第一个更改。找到此值后,我想将其复制到一个新的data.frame行数少。找到一定的值,并将其复制到另一个data.frame

下面是一个例子:

Picture of data.frame

ID Group Subgroup D   E 
1 1 A 2 1.25  1.10 
2 2 A 2 1.25  1.10 
3 3 A 2 1.25  1.10 
4 4 A 2 1.30  1.10 
5 5 A 2 1.32  1.10 
6 6 A 2 1.32  1.10 
7 7 B 4 3.20  2.42 
8 8 B 4 3.20  2.42 
9 9 B 4 3.20  2.49 
10 10 B 4 3.20  2.53 
11 11 B 4 3.20  2.57 
12 12 B 4 3.20  2.57 
13 13 C 3 2.10  1.80 
14 14 C 3 2.10  1.80 
15 15 C 3 2.10  1.87 
16 16 C 3 2.10  1.90 
17 17 A 5 3.30  2.50 
18 18 A 5 3.30  2.50 
19 19 A 5 3.40  2.50 

我希望以检测每组和子组的改变,所以在d 1.3 [4,4] A.2; B.4在E 2.49 [9,5];对于C.3在E 1.87 [15,5]和A.5在D 3.4 [19,4]

然后,我想这些值将在一个新的data.frame与较少的行,只显示值利益。

在这种情况下,这将是4x1行A.2,B.4,C.3和A.5以及一个名为“reactionT”的列,其中存储了来自D或E的值。事情是这样的:

Picture of result

ID   Group  Subgroup reationT 
1 1 A 2 1.30 
2 2 B 4 2.49 
3 3 C 3 1.87 
4 4 A 5 3.40 

回答

1

目前尚不清楚你要如何处理可能发生的情况是一个变化中的列“d”发生在同一时间,列“E”,所以我我已经把这些留作独立的专栏。

这里是一个可能的办法:

library(data.table) 
as.data.table(df1)[, list(D = D[diff(c(D[1], D)) > 0][1], 
          E = E[diff(c(E[1], E)) > 0][1]), 
        by = list(Group, Subgroup)] 
# Group Subgroup D E 
# 1:  A  2 1.3 NA 
# 2:  B  4 NA 2.49 
# 3:  C  3 NA 1.87 
# 4:  A  5 3.4 NA 

如果你知道永远不会有在“d”和“E”,同时在这个倒塌的形式列的值,我想你可以使用sumna.rm = TRUE将这些列折叠为1.

相关问题