有没有一种方法可以将不一致数组乘以0来表示R中的缺失值?

cnh2zyt3  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(81)

我试图找出一种方法来乘非一致数组元素。我认为这是一个简单的任务,但我一直有问题。
我有两张小table:

> table_a

chr1 chr2 chr3 
   5    5    5

以及

> table_b

chr1 chr2 
   5    5

我想将这些值按元素相乘,这样输出如下所示:

> table c

chr1 chr2 chr3
  25   25    0

使用

table_a * table_b

当两个表具有相同数量的元素时,可以工作,但我需要它来处理具有不同数量元素的文件。
我尝试过将表转换为 Dataframe ,并使用cbind、merge和各种连接,但总是遇到问题。我尝试使用大多数base r或更健壮的库(如dplyr等),但真的试图尽可能简单。任何建议都将不胜感激!
下面是我的代码:

# generating bed data
start1 <- seq(105000, 200000, by=20000)
stop1 <- start1+2000
chrs <- c("chr1", "chr2", "chr3")
x <- sort(rep(chrs, times=5))
df_a <- data.frame(chr=x, start=rep(start1,times=3), stop=rep(stop1,times=3))

start2 <-seq(800000, 920000, by=25000)
stop2 <- start2+2000

df_b <- data.frame(chr=x, start=rep(start2,times=3), stop=rep(stop2, times=3))
                   
# remove a chr from bed
df_b <- df_b[1:10,]
                   
                   
table_a <- table(df_a[,1])
table_b <- table(df_b[,1])
pw9qyyiw

pw9qyyiw1#

根据问题table_b名称是table_a名称的子集,因此:

replace(0 * table_a, names(table_b), table_a[names(table_b)] * table_b)
## chr1 chr2 chr3 
##  25   25    0

如果我们不能假设table_b名称是table_a的子集,那么使用以下代码:

nms <- union(names(table_a), names(table_b))
template <- setNames(numeric(length(nms)), nms)

nms0 <- intersect(names(table_a), names(table_b))
replace(template, nms0, table_a[nms0] * table_b[nms0]) |> as.table()
## chr1 chr2 chr3 
##  25   25    0

相关问题