微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据行和列元数据将 data.frame 中的一个值除以备用 data.frame 中的另一个值 数据

如何解决根据行和列元数据将 data.frame 中的一个值除以备用 data.frame 中的另一个值 数据

我有一个结构为=

的数据框
Gene    Transcript_ID   V1  V2  V3  V4
1   ENSG00000000003.14  ENST00000612152.4   0   6   0   3
2   ENSG00000000003.14  ENST00000373020.8   4   0   5   0
3   ENSG00000000003.14  ENST00000614008.4   0   0   0   0
4   ENSG00000000003.14  ENST00000496771.5   0   3   0   0

并且我在另一个结构为 =

的数据框中按 Gene 获得了汇总总数
Category                V1       V2      V3      V4    
1 ENSG00000000003.14     4.00       9.00    5.00    3.00  
2 ENSG00000000005.6      0.00       0.00    0.00    0.00  
3 ENSG00000000419.12     61.00      94.00  103.00   71.00  
4 ENSG00000000457.14     577.01     698.20  815.49  697.72 

我想将 data.frame 1 中的值除以 dataframe2 中相应的聚合值,以给出所有值的相对比例。

请问有人可以在这里应用一些简单的语法吗?非常感谢!

解决方法

我们可以在这里使用连接

library(data.table)
nm1 <- paste0("V",1:4)
setDT(df1)[,(nm1) := lapply(.SD,as.numeric),.SDcols = nm1]
df1[df2,(nm1) := Map(`/`,mget(nm1),mget(paste0("i.",nm1))),on = .(Gene = Category)]

-输出

 df1
                 Gene     Transcript_ID V1        V2 V3 V4
1: ENSG00000000003.14 ENST00000612152.4  0 0.6666667  0  1
2: ENSG00000000003.14 ENST00000373020.8  1 0.0000000  1  0
3: ENSG00000000003.14 ENST00000614008.4  0 0.0000000  0  0
4: ENSG00000000003.14 ENST00000496771.5  0 0.3333333  0  0

数据

df1 <- structure(list(Gene = c("ENSG00000000003.14","ENSG00000000003.14","ENSG00000000003.14"),Transcript_ID = c("ENST00000612152.4","ENST00000373020.8","ENST00000614008.4","ENST00000496771.5"
),V1 = c(0L,4L,0L,0L),V2 = c(6L,3L),V3 = c(0L,5L,V4 = c(3L,0L)),class = "data.frame",row.names = c("1","2","3","4"))

df2 <- structure(list(Category = c("ENSG00000000003.14","ENSG00000000005.6","ENSG00000000419.12","ENSG00000000457.14"),V1 = c(4,61,577.01),V2 = c(9,94,698.2),V3 = c(5,103,815.49),V4 = c(3,71,697.72)),"4"))
,

你也可以这样做:

df1 %>%
  left_join(df2,c('Gene' = 'Category')) %>%
  pivot_longer(starts_with('V'),names_to = c('name','.value'),names_sep = '[.]') %>%
  mutate(value = x/y,x = NULL,y = NULL) %>%
  pivot_wider()

# A tibble: 4 x 6
  Gene        Transcript_ID     V1    V2    V3    V4
  <chr>       <chr>          <dbl> <dbl> <dbl> <dbl>
1 ENSG000000~ ENST000006121~     0 0.667     0     1
2 ENSG000000~ ENST000003730~     1 0         1     0
3 ENSG000000~ ENST000006140~     0 0         0     0
4 ENSG000000~ ENST000004967~     0 0.333     0     0

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。