【问题标题】:Sum values by matching values across two dataframe通过匹配两个数据帧中的值来求和值
【发布时间】:2016-02-09 22:16:35
【问题描述】:

我有以下数据框。我想在两个数据框中匹配 X 列中的值(两列中的 X 值相同)并在 Cost 列中添加值并创建一个包含 X 列、lat 列、long 列的新数据框,然后显示合并/汇总的值,如下所示

data1
        X    Cost    lat       long        
    1 RA123  60     -113.8       NA
    2 RA124  50     -113.8       NA
    3 RB131  40     -113.8       NA
    4 RB132  30     -113.8       NA
    5 RB133  20     -113.8       NA
    6 RC134  10     -113.8       NA
    7 RC135  No     -113.9       NA
    8 RD136         -113.7       NA

data2
   X     Cost    lat       long        
1 RA123  10    -113.8      NA
2 RA124  20    -113.8       NA
3 RB131  40    -113.8      NA
4 RB132  30    -113.8       NA
5 RB133  50    -113.8       NA
6 RC134  60    -113.8       NA
7 RC135  No     -113.9       NA
8 RD136         -113.7       NA

consolidated # this dataframe contains sum of cost from dataframe 1 and 2 but also has original columns

       X     Cost    lat       long        
    1 RA123  70     -113.8       NA
    2 RA124  70     -113.8       NA
    3 RB131  80     -113.8       NA
    4 RB132  60     -113.8       NA
    5 RB133  70     -113.8       NA
    6 RC134  70     -113.8       NA
    7 RC135  No     -113.9       NA
    8 RD136         -113.7       NA

“成本”中的一些值是文本字符串,而一些是空白/无值。我现在想忽略文本字符串,如果没有值/空单元格,我想要一个 NA。

更新: 我使用以下代码来获取成本的总和值并保留所有原始列并忽略文本/字符串和 NA 值,即,只要有文本字符串,值就会显示 NA。没有输入值的空单元格也显示不适用:

Consolidated$Cost<- as.numeric(as.character(Consolidated$cost.x)) + as.numeric(as.character(Consolidated$cost.y))

现在,我需要做的是,只要有文本字符串,我就需要能够将“TextValue”显示为值而不是 NA。只是强调一下,无论字符串值是什么,对于 data1 和 data2 的任何给定 X 值,它都是相同的。

更新:我不得不使用以下方法将合并列中的这些行重命名为“TextValue”:

Consolidated$Cost[is.na(Consolidated$Cost)] <- "TextValue" 

我希望在第一步中就这样做。但我想这也行得通。

【问题讨论】:

  • 告诉我们更多关于专栏X,在data1data2中是否相同?
  • 哦,是的,对不起。 X中的列是相同的。可能顺序不同,但两列的 X 值相同
  • data2$Cost &lt;-data2$Cost + data1$Cost[match(data2$X, data1$X)]
  • 我刚刚运行了这段代码并得到了一个错误,并注意到成本列中也有一些字符串值和空单元格。我希望字符串值保持原样并空单元格以显示 NA。此外,您的代码会在同一数据集 data2 中产生成本。我想要一个包含原始列的新数据框,成本列应该是原始 2 个数据框的总和/合并值
  • 我找到的解决方案,不考虑非数值,是:data2[data2$X %in% data1$X,]$Cost

标签: r sum match


【解决方案1】:

我认为您可以通过简单的合并和添加来做到这一点。首先设置数据的一个子集,使用前面提到的空字符串值:

data1 <- data.frame(X=c("RA123", "RA124", "RA131"),
                    COST=c("60", "50", ""),
                    lat=c(-113.8,-113.8, -113.8),
                    long = c("NA", "NA", "NA"))
data2 <- data.frame(X=c("RA123", "RA124", "RA131"),
                    COST=c("10", "20", "30"),
                    lat=c(-113.8,-113.8, -113.8),
                    long = c("NA", "NA", "NA"))

然后您可以通过执行以下操作从数据框中删除空字符串值:

data1 <-subset(data1,COST!="")

然后您可以将您的因子COST 列转换为this SO post 中所述的数字:

data1$COST <- as.numeric(as.character(data1$COST))
data2$COST <- as.numeric(as.character(data2$COST))

这会将您的空字符串值替换为“NA”数值。一旦采用这种形式,数字“NA”+任何其他数字就等于另一个“NA”。所以你可以继续我最初建议的合并:

combined <- merge(data1,data2, by="X")
combined$COST <- combined$COST.x + combined$COST.y

从那里您可以使用subset(combined, select = -c(lat.x,long.x,...) ) 删除列。您还可以添加 all=TRUEall.x=TRUEall.y=TRUE 以更改保留 data1 或 data2 值的行为。有关合并功能的更多详细信息,请参阅this SO question

【讨论】:

  • 谢谢。在将成本值相加时合并是很好的挑战 - 该列中的一些值是文本,一些单元格是空白的。我试过 is.numeric 但它不会忽略文本并且不会将 NA 放在单元格为空的地方
  • 应该可以通过一些预处理轻松完成,请参阅编辑
  • 谢谢 - 但我想要得到的是不要将那些有字符串或 NA 的成本值相加,但我仍然希望那些成本有字符串或 NA 的 X 值显示在合并的数据集中。子集删除那些不是我想要的值
  • 查看修改,如有任何问题请告诉我
  • 谢谢-我使用了您的部分建议并合并了项目,但必须重命名合并列中的那些行,这些行在各个列中具有文本值,即 C1 中的 textvalue1 和 C2 中的 textvalue 2,因此合并列有 NA。我将合并列中的这些值重命名为“文本值”。更新了描述中的代码以显示我做了什么
猜你喜欢
  • 2021-07-08
  • 1970-01-01
  • 2017-06-21
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
  • 2021-12-21
相关资源
最近更新 更多