从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解决了您的问题吗?