很抱歉,这可能是一个非常基本的观点,但我找不到一个方便的工具。
我有一个(相当大的)数据表,并且希望不同列之间的差异,即
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后剩下的A,对于B,C和D列,我可以假定为零,但是当A中有一个N.A时,我不得不忽略这个观察。所以最终的结果应该是
A B C D E
9 N.A. 3 2 4
15 4 N.A. N.A. 11我正在删除DT中的所有列,这些列是A中的N.A. by DT <- DT!(DT$A=="N.A.")
然后我尝试了DT,E:= lapply(.SD,diff),.SDcols = c("A","B","C","D")。但这失败了,因为na.s。我不想手动将na.s转换为0(因为后来我可能想要区分什么是真正的零,什么是我推测的)--我想在函数中做这个。有人有一个好主意吗?
发布于 2017-09-27 13:05:50
给你:
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 4https://stackoverflow.com/questions/46448504
复制相似问题