我创建了一个函数,用“:”分割字符串并获取第一个元素,这是我需要从 vcf 获取的信息:
remove_semicolon = function(x){
newstr = strsplit(x,":")[[1]][1]
return(newstr)
}
我希望将其应用于数据框的每个元素,如下所示:
>rubbish
NS05 NS113 NS137
1 0/0:1 0/0:15 0/0:25
2 0/0:1 0/0:15 0/0:25
3 0/0:1 0/0:16 0/0:25
4 1/1:0,1:1:3:39,3,0 1/1:0,16:16:48:621,48,0 1/1:0,26:26:78:969,78,0
5 0/0:1 0/0:16 0/0:29
因此,对于垃圾[1,1],所需的输出是“0/0”,对于垃圾[4,1],所需的输出是“1/1”等,矩阵/数据帧结构保持不变。然而,
rubbish[]=lapply(rubbish,remove_semicolon)
返回:
> rubbish
NS05 NS113 NS137
1 0/0 0/0 0/0
2 0/0 0/0 0/0
3 0/0 0/0 0/0
4 0/0 0/0 0/0
5 0/0 0/0 0/0
尽管相反,
sapply(rubbish[,1],remove_semicolon)
返回我想要的,即向量 0/0, 0/0, 0/0, 1/1, 0/0 而不是全 0/0:
0/0:1 0/0:1 0/0:1 1/1:0,1:1:3:39,3,0
"0/0" "0/0" "0/0" "1/1"
0/0:1
"0/0"
执行 lapply 时我做错了什么?难道它不应该像 sapply 对列向量的每个元素一样,将remove_semicolon函数应用于垃圾的每个元素吗?
使用
apply(., MARGIN = 1:2, .)
似乎有效:
rubbish[] <- apply(rubbish, 1:2, remove_semicolon)
NS05 NS113 NS137
1 0/0 0/0 0/0
2 0/0 0/0 0/0
3 0/0 0/0 0/0
4 1/1 1/1 1/1
5 0/0 0/0 0/0
rubbish <- read.table(header = TRUE, text = "
NS05 NS113 NS137
0/0:1 0/0:15 0/0:25
0/0:1 0/0:15 0/0:25
0/0:1 0/0:16 0/0:25
1/1:0,1:1:3:39,3,0 1/1:0,16:16:48:621,48,0 1/1:0,26:26:78:969,78,0
0/0:1 0/0:16 0/0:29
")