从r中的数据帧中找出中断(交叉)的位置
我有一个数据帧:从r中的数据帧中找出中断(交叉)的位置,r,R,我有一个数据帧: df = read.table(text="ID location C1 C2 C3 C4 C5 C6 M01 1 A H H A A B M02 2 A H A A A B M03 3 A B A A A B M04 4 H B H A A B M05 5 H B H A A B M06 6 A B H A A
df = read.table(text="ID location C1 C2 C3 C4 C5 C6
M01 1 A H H A A B
M02 2 A H A A A B
M03 3 A B A A A B
M04 4 H B H A A B
M05 5 H B H A A B
M06 6 A B H A A H
M07 7 A B H B A H
M08 8 A B H A A H
M09 9 A B H A A H
M10 10 B B H A A H
M11 11 A B H A A H
M12 12 A B H A A H
M13 13 A B H A A H
M14 14 B B B A A H
M15 15 B B B A A A", header=T, stringsAsFactors=F)
我想找到交叉点或断点的位置(每列不同字母之间的连接)。例如,对于列C1
,第一个连接点应该是第3行和第4行。从第1行到第3行,它们都是A
。第4行是H
。所以这个交叉点的位置是3。预期结果是从C1
到C6
的列列表
$C1
3 5 9 10 13
$C2
2
$C3
1 3 13
$C4
6 7
$C5
$C6
5 14
感谢您的帮助。我们可以使用
lappy
循环“C”列,并比较相邻元素以找到索引
lapply(df[-(1:2)], function(x) which(x[-1]!= x[-length(x)]))
#$C1
#[1] 3 5 9 10 13
#$C2
#[1] 2
#$C3
#[1] 1 3 13
#$C4
#[1] 6 7
#$C5
#integer(0)
#$C6
#[1] 5 14
或者我们可以应用
运行长度编码
功能,即rle
,提取长度
,获得累积和并删除最后一个元素
lapply(df[-(1:2)], function(x) head(cumsum(rle(x)$lengths),-1))
我们可以使用
lappy
循环“C”列,并比较相邻元素以找到索引
lapply(df[-(1:2)], function(x) which(x[-1]!= x[-length(x)]))
#$C1
#[1] 3 5 9 10 13
#$C2
#[1] 2
#$C3
#[1] 1 3 13
#$C4
#[1] 6 7
#$C5
#integer(0)
#$C6
#[1] 5 14
或者我们可以应用
运行长度编码
功能,即rle
,提取长度
,获得累积和并删除最后一个元素
lapply(df[-(1:2)], function(x) head(cumsum(rle(x)$lengths),-1))
与
qtl
R软件包中的函数locateXO
相比,您的简单方法让我感到惊讶。@akrun:为什么会有lappy(df[-(1:2)]、函数(x)(x[-1]!=x))的警告?@ChirayuChamoli使用OP的数据,我在R3.3中没有收到任何警告。0@ChirayuChamoli我注意到您使用的代码与我发布的代码不一样,您的代码中的which(x[-1]!=x[-length(x)]
,您正在比较两个长度不等的向量,而我在比较之前删除了“x”中的第一个和最后一个值以使其长度相等。@ChirayuChamoli这样做解决了您的问题吗?与qtl
R包中的函数locateXO
相比,您的简单方法让我感到惊讶。@akrun:为什么会有lappy(df)警告[-(1:2)],函数(x)(x[-1]!=x))?@ChirayuChamoli使用OP的数据,我在R3.3中没有收到任何警告。0@ChirayuChamoli我注意到您使用的代码与我发布的which(x[-1]!=x[-length(x)]不同
在您的代码中,您正在比较两个长度不等的向量,而我在比较之前删除了“x”中的第一个和最后一个值,使其长度相等。@ChirayuChamoli解决了您的问题吗?