r - R 编码中的 if-else 语句不起作用
问题描述
我在 R 中进行了如下编码,
data1<-c(25,35,60,79,50)
data2<-c(100,150,170,200,1000)
g1=sort(data1)
g2=sort(data2)
ybar1<-mean(g1)
ybar2<-mean(g2)
#BIWEIGHT
med1=median(g1)
med2=median(g2)
mad1=1.4826*(median(abs(g1-med1)))
mad2=1.4826*(median(abs(g2-med2)))
u1=(g1-med1)/(9*mad1)
u2=(g2-med2)/(9*mad2)
#cat("\nu1:",u1)
u=rbind(u1,u2)
print(u)
abs=abs(u)
print(abs)
for(j in abs){
if(j < 1){
num1 = ((g1-med1)^2)*((1-(u1^2))^4)
den1 = ((1-(u1^2))*(1-5*(u1^2)))
num2 = ((g2-med2)^2)*((1-(u2^2))^4)
den2 = ((1-(u2^2))*(1-5*(u2^2)))
}
}
cat("\num2:",num2)
但是当我手动计算时,对于data1,每个值u1都小于1,因此编码与我的手动计算是正确的,但是对于data2,它包括大于1的u2值。谁能帮我找出原因发生以及如何解决?先感谢您。
解决方案
在我看来,问题在于在if
条件内(因此也在for
循环内),您总是采用整个向量(g1
, g2
, u1
, u2
)。您不会告诉 R只使用g1 和 g2 中 j<1 的那些值。相反,您使用整个向量的次数与其中abs
<1的值一样多。
此外,您将u1
and组合u2
为一个 2 行矩阵,但将 g1 和 g2 分开。这很令人困惑,会给您带来更多问题。我建议你为这两个向量做单独的循环。
你可以这样做:
idx1 <- which(abs(u1) < 1) #Gives you the indexes/positions in vector u1, where abs(u1)<1 is TRUE
idx2 <- which(abs(u2) < 1) #same for u2
for(i in idx1){
num1[i] = ((g1[i]-med1)^2)*((1-(u1[i]^2))^4)
den1[i] = ((1-(u1[i]^2))*(1-5*(u1[i]^2)))
}
for(j in idx2){
num2[j] = ((g2[j]-med2)^2)*((1-(u2[j]^2))^4)
den2[j] = ((1-(u2[j]^2))*(1-5*(u2[j]^2)))
}
这样,num1
并且den1
有 5 个元素,因为 u1 的所有绝对值都 <1。
相反,num2
并且den2
有 4 个元素,因为 u2 的最后一个值是 ca。2.07。
希望这对您有所帮助。
编辑:忘记将索引 ( [i] and [j]
) 添加到num1
/2
和den1
/ 2
。
推荐阅读
- javascript - 从变量调用函数
- r - 使用 dplyr summarise() 和 cross() 和基于胶水的格式不会产生预期的列名
- supabase - 无法更新 Supbase 表,因为它没有副本标识
- firebase - 如何防止 Firebase 实时数据库上的垃圾邮件?
- flutter - 如何在 VS 代码中检查字体样式文件
- ios - 离线 FairPlay 播放使网络请求加载 m3u8 播放列表
- amazon-web-services - Kubernetes - 入口控制器的 CertificateNotFound
- kotlin - @Test 提供未解决的参考 - Kotlin
- swift - iOS 14 SwiftUI UIViewRepresentable updateUIView 没有检测到 ObservedObject 的变化?
- python - 找不到包 mysql.connector