【问题标题】:counting frequency of incorrect value in rr中错误值的计数频率
【发布时间】:2013-09-16 16:02:30
【问题描述】:

这是我的示例数据集

 set.seed(123)
 myd <- data.frame (sub = paste ("S", 1:10, sep = ""), P1 = sample(c(1,-1,2,0), 10, replace = TRUE),
                    P2 = sample(c(1,-1,2,0), 10, replace = TRUE),
                    I1 = sample(c(1,-1,2,0), 10, replace = TRUE),
                    I2 = sample(c(1,-1,2,0), 10, replace = TRUE),
                    I3 = sample(c(1,-1,2,0), 10, replace = TRUE),
                    I4 = sample(c(1,-1,2,0), 10, replace = TRUE),
                    I5 = sample(c(1,-1,2,0), 10, replace = TRUE),
                    I6 = sample(c(1,-1,2,0), 10, replace = TRUE)
                    )
 myd 

  sub P1 P2 I1 I2 I3 I4 I5 I6
1   S1 -1  0  0  0  1  1  2  0
2   S2  0 -1  2  0 -1 -1  1  2
3   S3 -1  2  2  2 -1  0 -1  2
4   S4  0  2  0  0 -1  1 -1  1
5   S5  0  1  2  1  1  2  0 -1
6   S6  1  0  2 -1  1  1 -1  1
7   S7  2  1  2  0  1  1  0 -1
8   S8  0  1  2  1 -1  0  0  2
9   S9  2 -1 -1 -1 -1  0  0 -1
10 S10 -1  0  1  1  0 -1 -1  1

以值 P1 和 P2 为条件的不正确值的转换表: -1 是缺失值

  Condition   P1    P2         The value Incorrect
    I         1     1           None
    II        1     0           2
    III       0     1           2
     IV       2     0           2 or 0
      V       0     2          2 or 0
      VI      2     2          1 or 0
      VII     1     2          0
     VIII     2     1          0

 # if there is -1 in any of the value produce all values NA
      IX      -1      0           NA
      X        0     -1           NA
      XI      -1     -1           NA
      XII      -1     2           NA
       XIII     2    -1           NA
      XIV      -1     1           NA
      XV        1     -1           NA

以下是data.frame格式的转换表的短代码除了**用于IV,V,VI条件,我不知道如何输入,因为有两个值:

 ttable <- data.frame (P1 = c(1,1,0,2,0,2,1,2,-1, 0,-1,-1,2,-1,1), 
                     P2 = c(1,0,1,0,2,2,2,1,0,-1,-1,2,-1,1,1), 
                   errort = c("None", 2,2,2, 2,1,0,0,NA, NA, NA, NA, NA, NA,NA))

我想查看每行 s1 到 s10 的内容,我想检查 P1 和 P2 列中的值并将其与 I1 到 I6 列中的值匹配:

   sub   P1 P2 I1 I2 I3 I4 I5 I6
1   S1   -1  0  0  0  1  1  2  0

在这种情况下,P1 和 P2 的值之一是 -1,因此所有值都是 NA。

另一种情况:

          sub   P1 P2  I1  I2  I3  I4   I5  I6
           S4   0  2   0   0  -1   1   -1   1

这里P1 = 0,P2 = 2,所以下面的值 I1 = 不正确,I2 = 不正确,I3 = NA,I4 = 正确,I5 = NA,I6 = 正确

可以写成

sub   P1 P2  I1      I2     I3   I4     I5   I6
 S4   0  2   0      0      -1    1     -1    1

            FALSE, FALSE,  NA,  TRUE, NA,  TRUE 

此匹配条件 (V) 且 0 或 1 不正确,而 1 正确且缺少 -1

另一种情况:这里P1 = 0,P2 =1,匹配匹配表中的条件(III),所以不正确的值为2。

 5   S5  0  1   2      1     1     2      0      -1
               FALSE, TRUE,  TRUE  FALSE  TRUE    NA

我需要计算 false 的频率,我尝试了很多 if-else 语句,但没有给出所需的输出,我觉得其中很多很混乱,我认为这对于我将使用的大型数据集来说效率不高。

qcfun <- function (x) {
x <- x[3:length(x)]
obs1 =   table(c(x, 2, 0, 1, -1))
obs = obs1-1
ov <- NULL
if (x[1] == 1 & x[2] == 0){
ov = round (as.numeric (obs[4]/sum(obs)), 2)
} else {
if (x[1] == 0 & x[2] == 1){
ov = round (as.numeric (obs[4]/sum(obs)), 2)
} else {
if (x[1] == 1 & x[2] == 2){
ov = round (as.numeric (obs[2]/sum(obs)), 2)
} else {
if (x[1] == 2 & x[2] == 1){
ov = round (as.numeric (obs[2]/sum(obs)), 2)
} else {
if (x[1] == 1 & x[2] == 1){
ov = 0
} else {
ov = NA
}
}}}}
return (ov)
}
out1 <- apply(myd, 1,qcfun )
table (out1)
tout1 <- table (out1)

有没有一种快速/有效的方法来做到这一点?

【问题讨论】:

  • 你还没有发布你用来创建“翻译表”的代码,那么2,0 是什么意思?这是行不通的。
  • @Carl Witthoft 查看最近的编辑 - 2,0 表示(或者)2 或 0 都不正确。我不明白如何在 data.frame 中输入此条件
  • 条件 XV 的 P2 是否应为 -1?
  • 哦,这是错字,请参阅更正的表格,谢谢
  • 如果该行有P1和P2匹配条件V,为什么S4行中的值I4和I6不正确?

标签: r loops if-statement


【解决方案1】:

你可以使用这个向量化的函数,它对于大量的行会很有效:

fixI <- function(p1, p2, i){
    negative <- (p1 < 0) | (p2 < 0) | (i < 0)
    result <- ifelse(negative, NA, TRUE)  # conditions IX to XV

    p <- p1 * 10 + p2

    result[!negative & p %in% c(10,1,20,2) & i==2] <- FALSE
    result[!negative & p %in% c(20,2,22,12,21) & i==0] <- FALSE
    result[!negative & p==22 & i==1] <- FALSE

    result
}

将其应用于myd 中的I 列:

mat <- sapply(myd[,paste0("I",1:6)], fixI, p1=myd$P1, p2=myd$P2)

rownames(mat) <- myd$sub

结果:

       I1    I2   I3    I4    I5    I6
S1     NA    NA   NA    NA    NA    NA
S2     NA    NA   NA    NA    NA    NA
S3     NA    NA   NA    NA    NA    NA
S4  FALSE FALSE   NA  TRUE    NA  TRUE
S5  FALSE  TRUE TRUE FALSE  TRUE    NA
S6  FALSE    NA TRUE  TRUE    NA  TRUE
S7   TRUE FALSE TRUE  TRUE FALSE    NA
S8  FALSE  TRUE   NA  TRUE  TRUE FALSE
S9     NA    NA   NA    NA    NA    NA
S10    NA    NA   NA    NA    NA    NA

现在你可以像这样计算FALSEs:

按行:

apply(!mat, 1, sum, na.rm=TRUE)

 S1  S2  S3  S4  S5  S6  S7  S8  S9 S10 
  0   0   0   2   2   1   2   2   0   0 

按列:

apply(!mat, 2, sum, na.rm=TRUE)

 I1 I2 I3 I4 I5 I6 
  4  2  0  1  1  1 

【讨论】:

    猜你喜欢
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 2012-06-08
    相关资源
    最近更新 更多