使用gsub后如何对剩余值求和?

How to sum remaing values after using gsub?

这个问题我脑子没法解决,所以请大家帮忙。

这是我的部分数据:

rfam[1:20,]
     id              name
1  RF00001  LL_skoljka_r41782307_x1
2  RF00001   LL_skoljka_r9950955_x1
3  RF00001  LL_skoljka_r49323482_x1
4  RF00001  LL_skoljka_r14141437_x1
5  RF00001  LL_skoljka_r16457227_x3
6  RF00002  LL_skoljka_r40347558_x1
7  RF00002  LL_skoljka_r44415149_x1
8  RF00002  LL_skoljka_r13145032_x1
9  RF00002 LL_skoljka_r29248915_x42
10 RF00003  LL_skoljka_r15936986_x1
11 RF00003  LL_skoljka_r28953530_x1
12 RF00003  LL_skoljka_r32665758_x1
13 RF00003  LL_skoljka_r32835489_x1
14 RF00003  LL_skoljka_r32835498_x1
15 RF04051  LL_skoljka_r33254611_x1
16 RF04051 LL_skoljka_r29761867_x12
17 RF04051  LL_skoljka_r45123665_x2
18 RF04051 LL_skoljka_r34837827_x15
19 RF08595  LL_skoljka_r38900754_x1
20 RF08595  LL_skoljka_r22016530_x1

在第一步中,我想删除变量 name 中 x 之前的所有废话,所以我使用:

rfam$name<- as.data.frame(sapply(rfam$name, gsub, pattern='^.*?x', replacement=""))

结果:

rfam[1:20,]
     id       name
1  RF00001       1
2  RF00001       1
3  RF00001       1
4  RF00001       1
5  RF00001       3
6  RF00002       1
7  RF00002       1
8  RF00002       1
9  RF00002      42
10 RF00003       1
11 RF00003       1
12 RF00003       1
13 RF00003       1
14 RF00003       1
15 RF04051       1
16 RF04051      12
17 RF04051       2
18 RF04051      15
19 RF08595       1
20 RF08595       1

在第二步中,我想总结每个 id.

变量 name 中的值

结果应如下所示:

view(rfam)
     id       name
1  RF00001       7
2  RF00002      45
3  RF00003       5
4  RF04051      30 
5  RF08595       2

如果我想对值求和,变量应该是数字。我的两个变量都是因素。所以我使用 rfam[,1]=as.character(rfam[,1])id 转换为字符,并尝试通过 rfam[,2]=as.numeric(levels(rfam[,2])[rfam[,2]])name 转换为数字。 id改造成功,而namereturns"NA's".

我也试过rfam[,2]=as.numeric(as.character(rfam[,2])),结果还是一样

我尝试将数据导出到 txt 文件,然后在 excel 中进行其余分析,但是当我导出数据时,它看起来像这样:

      "id"     "name"
"1" "RF00001"   c(1, 1, 1, 1, 9, 1, 1, 1, 11, 1, 1, 1, 1, 1, 1, 3, 7, 5, 1, 1, 1, 9, 1, 14, 10, 7, 1, 5, 1, 1, 1, 1, 1, 7, 1, 2, 1, 1, 1, 9, 1, 7, 1, 1, 1, 1, 1, 1, 10, 7, 1, 10, 7, 1, 1, 1, 1, 1, 7, 1, 10, 1, 1, 1, 1, 1, 1, 1, 7, 1,...) 
"2" "RF00001"   c(1, 1, 1, 1, 9, 1, 1, 1, 11, 1, 1, 1, 1, 1, 1, 3, 7, 5, 1, 1, 1, 9, 1, 14, 10, 7, 1, 5, 1, 1, 1, 1, 1, 7, 1, 2, 1, 1, 1, 9, 1, 7, 1, 1, 1, 1, 1, 1, 10, 7, 1, 10, 7, 1, 1, 1, 1, 1, 7, 1, 10, 1, 1, 1, 1, 1, 1, 1, 7, 1,...)    
"3" "RF00001"   c(1, 1, 1, 1, 9, 1, 1, 1, 11, 1, 1, 1, 1, 1, 1, 3, 7, 5, 1, 1, 1, 9, 1, 14, 10, 7, 1, 5, 1, 1, 1, 1, 1, 7, 1, 2, 1, 1, 1, 9, 1, 7, 1, 1, 1, 1, 1, 1, 10, 7, 1, 10, 7, 1, 1, 1, 1, 1, 7, 1, 10, 1, 1, 1, 1, 1, 1, 1, 7, 1,...)

现在这是我的死胡同。我不明白发生了什么,如果你能帮助我,我将不胜感激。

更新

意识到您的问题与分组部分无关,问题是您的 sapply() 函数正在 rfam 中创建一个 data.frame 而不是向量。

您可以使用以下 data.table 解决方案将 rfam$name 列正确转换为所需的格式以便能够分组。

setDT(rfam)[,name:= as.numeric(gsub('^.*?x', replacement="",name))]

现在我们可以使用 dplyr 获得所需的输出:

library(dplyr)
as.data.frame(rfam) %>% group_by(id) %>% summarise(name=sum(name))