lapply 为每个数据框元素返回相同的值

问题描述 投票:0回答:1

我创建了一个函数,用“:”分割字符串并获取第一个元素,这是我需要从 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函数应用于垃圾的每个元素吗?

r lapply
1个回答
0
投票

使用

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
")
© www.soinside.com 2019 - 2024. All rights reserved.