当前位置: 首页 > 知识库问答 >
问题:

将一个数据框中的行(带有行名称)与另一个数据框中的匹配列名称相乘

东门晓博
2023-03-14

我有两个数据框:

df1 <- data.frame(Values=c(0.01,0.05), row.names=c("X", "Y"))
df1
  Values
X   0.01
Y   0.05

df2 <-data.frame(c(0,1,1), c(1,0,0), c(1,1,1))
colnames(df2) <- c("X","Y","Z")

df2
  X Y Z
1 0 1 1
2 1 0 1
3 1 0 1

我希望对 df2 执行逐行运算,我将 df2 中的每一列与 df1 中的相应行相乘,然后执行求和。

例如,对于df2的第1行,我希望计算:

df2 %>% rowwise %>% mutate(newVAL=(df1["X",]*df2[1,"X"])+(df1["Y",]*df2[1,"Y"]))

同时排除不匹配(df1中的行)或具有NAs的列。

我在df1中有几千行,在df2中有数千行和列。

非常感谢任何帮助!!

PS。我在Perl中使用哈希实现了这一点,并使用system()调用在Rmarkdown文档中执行这些计算。为了保持它的完全可再现性,我正试图用r重做它。如果有必要,乐意分享Perl代码。

谢了。

共有3个答案

郝永思
2023-03-14

我们还可以使用< code>rep使长度相同以相乘,然后得到< code>rowSums。使用< code>rep会更有效,因为它更快

rowSums(df2[rownames(df1)] * rep(df1$Values, each = nrow(df2)))
#[1] 0.05 0.01 0.01

或者使用< code > tidyrsverse 包

library(dplyr)
library(purrr)
df2 %>% 
     select_(.dots = rownames(df1)) %>% 
     map2(df1$Values, `*`) %>%
     reduce(`+`)
#[1] 0.05 0.01 0.01

如果我们需要它作为一个专栏,

df2 %>% 
    select_(.dots = rownames(df1)) %>%
    map2(df1$Values, `*`) %>%
    reduce(`+`) %>%
    mutate(df2, total = .)
#  X Y Z total
#1 0 1 1  0.05
#2 1 0 1  0.01
#3 1 0 1  0.01
南宫凯康
2023-03-14

下面是一个尝试,将两个集合之间的行与列进行基R匹配:

rowSums(
  sweep(df2,
        MARGIN=2,
        STATS=df1$Values[match(colnames(df2), rownames(df1))],
        FUN=`*`),
  na.rm=TRUE
)
#[1] 0.05 0.01 0.01
法和安
2023-03-14

如果我理解正确的话,看起来您需要< code >清扫。

df3 <- sweep(df2[, rownames(df1)], 2, t(df1), '*')
df3$total <- rowSums(df3)
 类似资料:
  • 我有一个数据帧(df1),其中包含200多列数据(每列数千行)。列名是字母数字的,并且彼此不同。 我有第二个数据集(df2),其中包含几列,其中第一列(名为“col1”)包含带有“值”的行,这些行带有df1的列名。 但不是对于df2中的每一行,我在df1中具有对应的列。 现在,我想删除(删除)df2中没有“对应”列的所有行。 我用“子集data.frame另一个data.frame的值”这样的关键

  • 我有一个包含两列的数据框架(DF1) 和另一个像这样的数据帧(DF2) 我必须将DF2中的各个字符串值替换为它们在DF1中的相应值…例如,在操作之后,我应该取回这个数据框。 我尝试了多种方法,但似乎无法找到解决方案。

  • 问题内容: 我有两个数据框,第一个有1000行,看起来像: 该列具有不同的值,有时会重复,但通常大约有50个唯一值。 第二个数据框包含所有这50个唯一值(50行)以及与这些值关联的酒店: 我的目标是用第二个数据帧的列的相应值替换第一个数据帧的列中的值,或者用相应的值创建该列。当我尝试通过像 我有一个错误,即数据帧的大小不相等,因此无法进行比较 问题答案: 如果将索引设置为另一个df上的“组”列,则

  • 我有两个熊猫数据框 步骤1:根据df1中唯一的“val”在df2中创建列,如下所示: 步骤2:对于flag=1的行,AA_new将计算为var1(来自df2)*组“A”和val“AA”的df1的'cal1'值*组“A”和val“AA”的df1的'cal2'值,类似地,AB_new将计算为var1(来自df2)*组“A”和val“AB”的df1的'cal1'值*组“A”和val“AB”的df1的'c

  • 问题内容: 我在我的网站中使用带有php的sql server 2008 r2。我有2张桌子。 1是给员工的。 2是上班 我想进行查询,以便给我提供类型为<3的员工姓名的工作描述。 就是说我想得到这样的结果。 同样地 那么我如何使用sql查询实现此结果呢? 我无法更改表架构。 我试图与case语句一起使用,但无法正常工作。 请帮我使这个工作.. 问题答案: 它的内容并不能完全回答问题,但是会建议您

  • 问题内容: 我引用的数据框如下(是列名): 但是我不想被硬编码,我想要一个变量来使其动态。怎么做? TIA 问题答案: 您可以使用方括号对列进行索引: 因此,当您接受输入为a时,您可以执行以下操作: 此外,将列作为属性访问可能导致模棱两可的行为。如具有列命名,并尝试做这可能要列不同的值,或者如果你有一个名为一样像任何有效的方法DF柱或那么这将导致语法错误。 因此,我强烈建议您使用方括号来选择列。