2013-02-24 48 views
7

計算兩個數據表的和時,NA+n=NA僅在添加數字時將NA僅視爲零

> dt1 <- data.table(Name=c("Joe","Ann"), "1"=c(0,NA), "2"=c(3,NA)) 
> dt1 
    Name 1 2 
1: Joe 0 3 
2: Ann NA NA 
> dt2 <- data.table(Name=c("Joe","Ann"), "1"=c(0,NA), "2"=c(2,3)) 
> dt2 
    Name 1 2 
1: Joe 0 2 
2: Ann NA 3 
> dtsum <- rbind(dt1, dt2)[, lapply(.SD, sum), by=Name] 
> dtsum 
    Name 1 2 
1: Joe 0 5 
2: Ann NA NA 

我不想取代所有NA與0。我要的是NA+NA=NANA+n=n得到以下結果:

Name 1 2 
1: Joe 0 5 
2: Ann NA 3 

這是如何在R來?

UPDATE:在DT1刪除錯字

+0

如果你回到你以前的問題,人們可以更好地理解你希望接受什麼mplish,可以提供更好的幫助。 http://stackoverflow.com/questions/15044342/sum-of-hybrid-data-frames-depending-on-multiple-conditions-in-r – 2013-02-24 23:28:18

+0

我在這裏已經隔離了這個問題。另一個問題現在已經解決了。 – 2013-02-24 23:31:40

回答

10

您可以定義自己的功能,只要你想採取行動

plus <- function(x) { 
if(all(is.na(x))){ 
    c(x[0],NA)} else { 
    sum(x,na.rm = TRUE)} 
} 


rbind(dt1, dt2)[,lapply(.SD, plus), by = Name] 
+0

(+1)'x [0]'! – Arun 2013-02-24 23:25:50

+1

你也可以使用'as(NA,class(x))',我沒有進行基準測試,看哪個更快。 – mnel 2013-02-24 23:26:56

+0

@ R-obert,mnel的功能非常好。您可以把它放到你剛纔的問題中,只需在'DTsum < - ...'和'sumD3D4 < - ...'的兩行中用mnel的'plus'替換'sum'' – 2013-02-24 23:31:04

4
dtsum <- rbind(dt1, dt2)[, lapply(.SD, function(x) ifelse(all(is.na(x)), as.numeric(NA), sum(x, na.rm=T))), by=Name] 

(包括@ Arun的建議) na.rm=TRUE是非常有用的記得

+0

對不起,剛剛意識到這會給出'NA + NA = 0',我不認爲你想要 – alexwhan 2013-02-24 23:08:14

+0

OP在任何時候都不計算'NA + NA'(給出'dt1'和'dt2'的方式] (不是如何顯示)' – mnel 2013-02-24 23:11:19

+0

@mnel在問題中修復了一個錯字 – 2013-02-24 23:12:41