Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:识别列对并计算差异_R - Fatal编程技术网

R:识别列对并计算差异

R:识别列对并计算差异,r,R,我有一个数据帧df,如下所示: X A_T B_N B_T C_N C_T C_T.1 C_T.2 D_N D_T D_T.1 E_T F_N w 1 5 9 13 17 21 25 29 33 37 41 45 x 2 6 10 14 18 22 26 30 34 38 42 46 y 3 7 11 15 19

我有一个数据帧df,如下所示:

X   A_T  B_N  B_T C_N   C_T  C_T.1  C_T.2  D_N  D_T  D_T.1  E_T  F_N
w   1    5    9   13    17   21     25     29   33   37     41   45
x   2    6   10   14    18   22     26     30   34   38     42   46
y   3    7   11   15    19   23     27     31   35   39     43   47
z   4    8   12   16    20   24     28     32   36   40     44   48
在第一列之后的WARE列在这里有一个前缀a到F,但可以是包含字符、数字或符号的任何其他字符串,然后是a u,然后是T或N。然后以T结尾的ID也可以在末尾有.1或.2

我想做的是首先识别具有相同前缀的所有可能的ID对,在这样一个表中,m1和m2只是指每对ID的member1和member2,m1是_N成员,m2是_T成员,pair是ID对的名称:

m1    m2     pair
B_N   B_T    B
C_N   C_T    C
C_N   C_T.1  C.1
C_N   C_T.2  C.2
D_N   D_T    D
D_N   D_T.1  D.1
请注意,不属于一对的ID像a、E和F一样被丢弃

然后我想计算每一对的m2和m1的df列之间的差异,并将其放入一个新表中,其中每一列是一对,如下所示:

X   B   C   C.1   C.2   D   D.1
w   4   4   8     12    4   8
x   4   4   8     12    4   8
y   4   4   8     12    4   8
z   4   4   8     12    4   8
请注意,该解决方案需要适用于较大的数据帧,其中我们无法单独指示值,并且适用于ID前缀可以是任何包含字符、数字或符号的字符串的数据帧

请让我知道,如果有什么我可以澄清,并感谢您的帮助

df的dput:

> dput(df)
structure(c("w", "x", "y", "z", "1", "2", "3", "4", "5", "6", 
"7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", 
"18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", 
"29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", 
"40", "41", "42", "43", "44", "45", "46", "47", "48"), .Dim = c(4L, 
13L), .Dimnames = list(NULL, c("X", "A_T", "B_N", "B_T", "C_N", 
"C_T", "C_T.1", "C_T.2", "D_N", "D_T", "D_T.1", "E_T", "F_N")), class = "noquote")

下面是一种使用tidyverse工具执行此操作的方法

用于重塑数据形状-先长后宽

用于常规数据操作,包括内部连接

仅用于创建pair变量的字符串操作

图书馆弹琴 图书馆三年 图书馆长 创建数据 df_原价% separatekey,cprefix,后缀,sep=_ 德福朗 >A tibble:48 x 4 >X前缀后缀值 > * >1 w A T 1 >2 x A T 2 >3 y A T 3 >4 z A T 4 >5 w B N 5 >6xBn6 >7 y B N 7 >8 z B N 8 >9 w B T 9 >10 x B T 10 > ... 还有38行 为N和T创建单独的表 df_n% filtersuffix==N df_t% 过滤器UFFIX!=N 合并N表和T表以获得对,计算差异,重塑宽度 在这里,您应该使用和internal_join删除只在其中一个中出现的案例,如A、E和F

df_合并% mutatepair=str_cprefix,str_subsuffix_m2,2, 值=值\u m2-值\u m1%>% 选择X,配对,值%>% 电子数据对,值 df_合并 >一个tibble:4x7 >X B C.1 C.2 D.1 > * >1 w 4 4 8 12 4 8 >2x4481248 >3 y 4 8 12 4 8 >4Z4481248
谢谢你详细的回答!我发现错误“read_table2”不是从“namespace:readr”@arielle导出的对象。您可能必须安装最新版本的readr。但是对于这个例子来说,这也不重要,这就是我如何重新创建数据的方式,您必须已经在R中拥有了数据。