很抱歉,如果这可能是一个非常基本的观点,但我找不到方便的工具。
我有一个(非常大的)数据表,希望区分各列,即
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(因为稍后我可能想要区分什么是真正的零和我所估算的) - 我想在函数内部进行。有人有个好主意吗?
答案 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