将列表中的每个 data.frame 除以另一个 data.frame

Divide each data.frame inside of a list by another data.frame

我有一个包含 1000 个 data.frames 的列表,我需要将每个列表除以 'single' data.frame.

要点是 data.frames(包含在列表中)中的每个观察值都有特定的 ID,这些 ID 必须与 'single' data.frame 和未包含的 ID 相匹配后者必须被忽略(因为没有除法是可能的)。

这里是列表中包含的我的 data.frames 之一的示例:

df = read.table(text = 'ID   Num
                        D     34
                        W     45
                        Q     12
                        Y     45
                        B     11
                        O      2', header = TRUE)

'single'data.frame如下:

sing_df = read.table(text = 'ID  Num
                              D   14
                              Q   11
                              B    9', header = TRUE)

df 除以 sing_df 我的输出应该是:

ID   Num
D    2.428
Q    1.09
B    1.22

有什么建议吗?

我们可以 merge 数据集 'ID' 并通过将 'Num.x' 除以 'Num.y' 创建 'Num'。

transform(merge(df, sing_df, by = "ID"), Num = Num.x/Num.y)[-(2:3)]
#  ID      Num
#1  B 1.222222
#2  D 2.428571
#3  Q 1.090909

如果我们需要一些包,那么 dplyr 中的 inner_join 会有所帮助

library(dplyr)
inner_join(df, sing_df, by = "ID") %>%
        mutate(Num = Num.x/Num.y) %>%
        select(-Num.x, -Num.y)

正如 OP 提到的大约 1000 个数据集,最好将其保存在 list 中,遍历 list 元素并应用与上述相同的步骤

lst1 <- lapply(lst, function(dat) transform(merge(dat, sing_df, by = "ID"), 
             Num = Num.x/Num.y)[-(2:3)])