R数学运算NA值

R数学运算NA值,r,R,我在R中有一个数据帧,如下所示: 我想对每一列执行以下操作: ((abs(a-b))+(abs(a-c))+(abs(a-d)))/200 问题是某些行将具有NA值,因此在执行此操作时: data$E=(abs(data$a-data$b)+abs(data$a-data$c)+abs(data$a-data$d))/200) 对于许多行,列E中的结果将为NA。除非它们没有任何NA值(如ID1中) 理想情况下,我希望分子操作在遇到第一个NA时停止。因此,对于ID 4,可以这样说: (abs(

我在R中有一个数据帧,如下所示:

我想对每一列执行以下操作:

((abs(a-b))+(abs(a-c))+(abs(a-d)))/200 问题是某些行将具有NA值,因此在执行此操作时:

data$E=(abs(data$a-data$b)+abs(data$a-data$c)+abs(data$a-data$d))/200)
对于许多行,列E中的结果将为NA。除非它们没有任何NA值(如ID1中) 理想情况下,我希望分子操作在遇到第一个NA时停止。因此,对于ID 4,可以这样说:

(abs(a-b)+(abs(a-c)))/200 因此,由于其NA值,省略了d列


任何帮助都将不胜感激。谢谢

这里是一个使用
rowSums()
的基本R解决方案,其中选项
na.rm
应设置为
TRUE

您可以尝试以下代码以实现您的目标:

data$j <- rowSums(abs(replicate((ncol(data)-2),df$a) - data[-(1:2)]),na.rm = T)/156
数据

data <- structure(list(ID = 1:6, a = c(0, 0, 0, 0, 0, 0), b = c(0, 0, 
0, 0, 0, 0), c = c(0, 0, 0, 0, 0, 0), d = c(1, 1, 0, 0, NA, 0
), e = c(NA, 1, 0, 0, NA, 0), f = c(NA, NA, NA, 0, NA, NA), g = c(NA, 
NA, NA, NA, NA, NA), h = c(NA, NA, NA, NA, NA, NA), i = c(NA, 
NA, NA, NA, NA, NA)), row.names = c(NA, -6L), class = "data.frame")

data这是我使用
tidyverse
的努力。如果我误解了你的问题,请告诉我:

数据%
变异(
x=(如果其他(!is.na(a-b),abs(a-b),0)+
ifelse(!is.na(a-c),abs(a-c),0)+
ifelse(!is.na(a-d),abs(a-d),0))/200
)
#>a b c d x
#> 1 40 3  0 10 0.535
#>2 20 3 NA 0.085
#> 3  2 5  4 10 0.065
#>4408Na0.040
#> 5  5 0  0 10 0.075

由(v0.3.0)于2020-01-02创建

NA
替换为0?但是,这个动作的语义连贯吗?如果某个值不可用,则假定该值为0与假定该值为42一样任意。您尝试做的似乎是临时的。我不能假设为0,因为我正在计算可变性,而0具有真正的意义。实际数据来自胚胎中的细胞。我想你不是假设它为零,而是假设它是
a
,但你仍然在假设缺少值。每列代表一个与另一个细胞接触的细胞。一些细胞被许多细胞(最多8个)接触,但其他细胞仅被2或3个细胞接触,这取决于它们在胚胎上的位置。不幸的是,它们并不是一个完美的网格。我手动计算了它,结果对NA数据不起作用。而且,它不能与比示例更大的真实数据集一起工作。谢谢though@Amaranta_Remedios为什么不工作?你有更多的专栏吗?我不确定您是否想要
abs((a-b)+(a-c)+(a-d))/200
(abs(a-b)+abs(a-c)+abs(a-d))/200
是的,实际数据最多有8列(a到h),并且不同IDs@Amaranta_Remedios查看我的更新解决方案。还有一件事,我不确定你想要
abs((a-b)+(a-c)+(a-d))/200
(abs(a-b)+abs(a-c)+abs(a-d))/200
,因为两个公式给出的结果不同results@Amaranta_Remedios也许最好是
dput(),我猜你需要大量的手工工作,当你应用你接受的答案时,你有8列,但我的不需要
data <- structure(list(ID = 1:6, a = c(0, 0, 0, 0, 0, 0), b = c(0, 0, 
0, 0, 0, 0), c = c(0, 0, 0, 0, 0, 0), d = c(1, 1, 0, 0, NA, 0
), e = c(NA, 1, 0, 0, NA, 0), f = c(NA, NA, NA, 0, NA, NA), g = c(NA, 
NA, NA, NA, NA, NA), h = c(NA, NA, NA, NA, NA, NA), i = c(NA, 
NA, NA, NA, NA, NA)), row.names = c(NA, -6L), class = "data.frame")