2017-09-27 45 views
0

对不起,如果它可能是一个非常基本的点,但我找不到一个方便的工具。data.table中的列之间的差异

我有一个(非常大)的数据表,并要跨列的区别,那就是

A  B  C  D 

9  N.A. 3  2 
15 4  N.A. N.A. 
N.A. N.A 2  3 

我想创建一个新的E列那就是剩下一个的差分B之后,C和D.对于B,C和D列中的NAs,我可以假设为零,但是当AI中有NA时,必须忽略这个观察。因此,最终的结果应该是

A  B  C  D  E 

9  N.A. 3  2  4 
15 4  N.A. N.A. 11 

我删除所有在DT是酸钠在由 DT <列 - DT [(DT $ A == “NA”)!]

和那么我尝试了 DT [,E:= lapply(.SD,diff),.SDcols = c(“A”,“B”,“C”,“D”)]。 但由于N.A.的原因而失败。 我不想手动将N.A.s更改为0(因为后面我可能想区分什么是真正的零和我所推测的是什么) - 我想在一个函数内部完成。有人有一个好主意吗?

回答

0

我承担所有列型性格AR。

require(data.table) 

DT <- data.table(A = c("9", "15", "N.A."), 
       B = c("N.A.", "4", "N.A."), 
       C = c("3", "N.A.", "2"), 
       D = c("2", "N.A.", "3")) 
DT <- DT[A != "N.A."] 

计算行号。

DT[, rownum := .I] 

您将收到警告,因为N.A.无法转换为数字类型。

DT[, E := as.numeric(A) - sum(as.numeric(B), 
           as.numeric(C), 
           as.numeric(D), na.rm = T), by = rownum] 
DT 
1

在这里你去:

df$E[!is.na(df$A)] = 2*df$A[!is.na(df$A)] - rowSums(df[!is.na(df$A),], na.rm = T) 

例子:

df = data.frame(A = c(19,25,NA,17),B = c(1,2,3,4), C = c(5,NA,NA,9), D = c(3,1,2,NA)) 

>df 
    A B C D 
1 19 1 5 3 
2 25 2 NA 1 
3 NA 3 NA 2 
4 17 4 9 NA 

df$E[!is.na(df$A)] = 2*df$A[!is.na(df$A)] - rowSums(df[!is.na(df$A),], na.rm = T) 

> df 
    A B C D E 
1 19 1 5 3 10 
2 25 2 NA 1 22 
3 NA 3 NA 2 NA 
4 17 4 9 NA 4