通过匹配两个数据帧的值来求和值

时间:2016-02-09 22:16:36

标签: r sum match

我有以下数据框。我希望在两个数据框中匹配X列中的值(两列中的X值相同)并在“成本”列中添加值并创建一个包含列X,列lat,列长的新数据帧然后显示合并/总结值,如下所示

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。

更新: 我使用以下代码来获取Cost的总计值并保留所有原始列并忽略文本/字符串和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" 

我希望在第一步中做到这一点。但我想这也有效。

1 个答案:

答案 0 :(得分: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))

这将使用&#34; NA&#34;替换空字符串值。数值。一旦进入那个形式的数字&#34; NA&#34; +任何其他数字只等于另一个&#34; NA&#34;。所以你可以继续我最初建议的合并:

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