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

如何计算具有公共列名的不同数据帧之间的差异

仉磊
2023-03-14

我有三个数据帧,并试图计算由数据帧1调节的两个数据帧(Df2和Df3)之间的差值。如下面的示例所解释的,我有三个数据帧,Df1、Df2和Df3,它们具有共同的名称。第一步,在Df1中,我想比较“Standard”列和所有三列的值,“das”、“dss”和“tri”可能是行的,并且当这些列的任何值,“das”、“dss”和“tri”高于Df1中的“Standard”时,计算Df2和Df3中相同位置的差值,并将差值放在单独的列中。

Df1             
    Names   Standard    Das Dss Tri
    Aa  3   3   6   2
    Ab  4   6   4   3
    Ac  2   5   2   4
    Ad  4   3   3   8
    Ae  6   4   5   7
    Af  4   5   7   5
    Ag  2   6   8   2
    Ah  9   7   6   2

Df2         
    Names   Das Dss Tri
    Aa  4   2   5
    Ab  7   5   4
    Ac  5   7   2
    Ad  6   4   3
    Ae  5   3   5
    Af  3   2   6
    Ag  2   5   4
    Ah  4   6   3

DF3

Names   Das Dss Tri
    Aa  5   3   5
    Ab  8   5   4
    Ac  6   7   2
    Ad  6   4   7
    Ae  5   3   8
    Af  4   5   6
    Ag  1   5   4
    Ah  4   6   3

最终输出

Df3             
    Names   Das Dss Tri Difference
    Aa  5   3   5   -1
    Ab  8   5   4   -1
    Ac  6   7   2   -1
    Ad  6   4   7   -4
    Ae  5   3   8   -3
    Af  4   5   6   -4
    Ag  1   5   4   1
    Ah  4   6   3   0

共有1个答案

储思聪
2023-03-14

下面是一个脚本,如果找到一个以上的值,它将获取第一个最大值的索引,如果没有找到值,则返回NA

df1 <- structure(list(standard = c(3, 4, 2, 4, 6, 4, 2, 9), das = c(3, 
6, 5, 3, 4, 5, 6, 7), dss = c(6, 4, 2, 3, 5, 7, 8, 6), tri = c(2, 
3, 4, 8, 7, 5, 2, 2)), .Names = c("standard", "das", "dss", "tri"
), row.names = c(NA, -8L), class = "data.frame")

df2 <- structure(list(das = c(4, 7, 5, 6, 5, 3, 2, 4), dss = c(2, 
5, 7, 4, 3, 2, 5, 6), tri = c(5,4,2,3,5,6,4,3)), .Names = c("das", "dss", "tri"
), row.names = c(NA, -8L), class = "data.frame")

df3 <- structure(list(das = c(5, 8, 6, 6, 5, 4, 1, 4), dss = c(3, 
     5, 7, 4, 3, 5, 5, 6), tri = c(5,4,2,7,8,6,4,3)), .Names = c("das", "dss", "tri"
 ), row.names = c(NA, -8L), class = "data.frame")

# get indices. run through every row of df1
# and get the maximum column index > standard
idx.v <- sapply( 1:nrow(df1), function(idx) {
    t <- which(df1[idx, 2:4] > df1[idx, 1])
})

df3$result <- sapply(1:length(idx.v), function(ix) {
    col.idx <- idx.v[[ix]]
    len.idx <- length(col.idx)
    if (len.idx > 0) {
        res <- sum(df2[ix, col.idx] - df3[ix, col.idx])
    } else {
        res <- NA
    }
})

Output:

> df3
  das dss tri result
1   5   3   5     -1
2   8   5   4     -1
3   6   7   2     -1
4   6   4   7     -4
5   5   3   8     -3
6   4   5   6     -4
7   1   5   4      1
8   4   6   3     NA

谢谢你的聊天。这就是你的要求。

 类似资料:
  • 我在数据帧df1中有一组列(col1,col2,col3)我在数据帧df2中有另一组列(col4,col5,col6)假设这两个数据帧具有相同的行数。 如何生成在df1和df2之间进行成对相关的相关表? 这张桌子看起来像 我使用,它似乎没有按要求生成表。 我已经看到了如何检查两个数据集的匹配列之间的相关性的答案?,但主要的区别在于col名称不匹配。

  • 我有一个由66个变量的10299个观测值组成的数据框。其中一些变量共享一个通用的列名,我想计算每个观测值的这些变量的平均值。 具有以下矩阵,列名: 我想得到: 我尝试了循环,命令,但没有得到所需的结果。 抱歉,如果这个问题看起来太基本了,我已经在谷歌上查过可能的解决方案,但没有找到任何解决方案。

  • 我知道这不是一个人应该在这里做的事情,尽管我不知道否则我怎么能问这个问题。 我的目标是统计有多少行具有相同的第一预测值(购买、维护等),但评级不同。 我的尝试是通过第一列来计算,然后计算我得到的不同评分,这将是非常棒的。 一个重要的假设是,如果两行相同,则它们已被预先擦除。因此,可以找到不同等级的行,但没有相同的行。 在我的示例中,第1行和第3行是相同的,因此其中一行被擦除,没有问题。然而,对于其

  • 我在dataframe中总共有100列。我试图比较两个数据帧,并找到列名不匹配的记录。我得到了以下代码的输出,但当我运行100列的代码时,作业被中止。 我正在为SCD类型2增量进程错误查找执行此操作。 请建议任何其他方式。

  • 问题内容: 假设我有一个包含3列的数据框:日期,股票行情,值(无索引,至少从此开始)。我有很多约会,很多股票,但是每个元组都是唯一的。(但是很显然,同一日期将显示在多行中,因为它将在多个行情中出现,而同一行情显示将在多行中显示,因为它将存在许多日期。) 最初,我的行以特定顺序排列,但没有按任何列进行排序。 我想计算每个股票报价的第一个差异(每日变化)(按日期排序),并将其放在数据框中的新列中。在这

  • 我有一个简短的问题 我有一个数据帧,有许多测量列。我想计算具有相同(标题)名称的列的平均值。我使用下面的代码(在stackoverflow中找到)。。 如何计算数据帧中具有相同列名的列的平均值 作为示例数据... 结果是这样的。。。 这段代码告诉我具有相同(标题)名称的列的含义。 但是我也想要均方差。我试着用rowSds替换rowMeans,但是不起作用。 知道如何使用相同的代码来计算均方差吗??