data.table

时间:2017-09-27 12:56:52

标签: r

很抱歉,如果这可能是一个非常基本的观点,但我找不到方便的工具。

我有一个(非常大的)数据表,希望区分各列,即

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后A的剩余部分。对于列B,C和D中的NA,我可以假设为零,但是当有一个NA时AI必须忽略这一观察。所以最终的结果应该是

A     B     C     D     E

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

我正在删除DT中N.A.中的所有列 DT< - DT [!(DT $ A ==“N.A。”)]

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

2 个答案:

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

答案 1 :(得分:0)

我假设所有列都是字符类型。

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