2016-02-09 63 views
0

我有以下數據框。我希望在兩個數據框中跨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。

更新: 我使用下面的代碼來獲取Cost的總和值並保留所有原始列,並忽略文本/字符串和NA值,即任何存在文本字符串的位置,該值顯示NA。那裏有沒有也進入價值空單元格顯示NA:

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

現在,我需要做的是能夠做的就是哪裏有文本字符串,我需要能夠顯示「TextValue」爲價值而不是NA。爲了突出顯示,無論字符串值是什麼,對於數據1和數據2兩者中的任何給定值X都是相同的。

更新:我已經使用重命名合併列「TextValue」的那些行:

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

我希望第一步自身內這樣做。但我想這也可以。

+0

告訴我們更多關於'X'列的信息,'data1'和'data2'是否一樣? – Julius

+0

哦,是的,對不起。 X中的列是相同的。可能不是相同的順序,但X值將在兩列相同 – oivemaria

+0

'data2 $ Cost <-data2 $ Cost + data1 $ Cost [match(data2 $ X,data1 $ X)]' –

回答

0

我認爲你可以用一個簡單的合併和添加來做到這一點。首先設置你的數據的一個子集,與aforemention空字符串值:

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

+0

謝謝。在合併成本值的時候,合併就沒問題了 - 該列中的某些值是文本,某些單元格是空白的。我試過is.numeric,但它不會忽略文本,並且不會把NA放在單元格爲空的地方 – oivemaria

+0

應該可以輕鬆地完成一些預處理,請參閱編輯 – JHowIX

+0

謝謝 - 但是我試圖得到的是不總結那些值有字符串或NA的成本,但我仍然希望這些X值的成本在字符串或NA中顯示在統一數據集中。子設置刪除那些不是我想要的值 – oivemaria

相關問題