【问题标题】:R data frame. How to count the number of rows addressing multiple conditions?R 数据框。如何计算处理多个条件的行数?
【发布时间】:2014-08-22 05:41:54
【问题描述】:

在一个数据框(患者数据库)中,我想计算针对特定条件的行数(患者数),这里的值为 3,至少一次(使用运算符“或”:“ |"),在反复评估中(实际上是重新做手术)。这种特定情况可以在一、二、三或更多评估中发生一、二、三四次或更多。如果至少按时测量到 3 的值,则应计算行(患者)。这是我的数据框的修改摘录,它有 62 列和大约 300 行。

> df
    grade_chir_1 grade_chir_2 grade_chir_3 grade_d_chir
2              1          NaN            3            3
3              1          NaN          NaN          NaN
4            NaN            2          NaN          NaN
5              2          NaN          NaN          NaN
6              2            3            2            3
7              3          NaN          NaN          NaN
8              1          NaN            3          NaN
9              1          NaN          NaN          NaN
10             3            3          NaN          NaN
11             1            3            3          NaN
12             1          NaN          NaN          NaN
13             2            2          NaN          NaN
14             1          NaN          NaN          NaN
15             1            3            2            3
16             1          NaN          NaN          NaN

到目前为止,我只发现了这种不太优雅的方法:

count(datam$grade_chir_1 == 3 | datam$grade_chir_2==3 | datam$grade_chir_3==3 | datam$grade_d_chir==3)[1,2]

这给了我我推测的正确数字,但不是很好。

欢迎任何线索。

谢谢。

【问题讨论】:

    标签: r dataframe conditional-statements


    【解决方案1】:

    或者

    datam <-read.table(header=T, stringsAsFactors = F, text='
           grade_chir_1 grade_chir_2 grade_chir_3 grade_d_chir
              1          NaN            3            3
              1          NaN          NaN          NaN
            NaN            2          NaN          NaN
              2          NaN          NaN          NaN
              2            3            2            3
              3          NaN          NaN          NaN
              1          NaN            3          NaN
              1          NaN          NaN          NaN
             3            3          NaN          NaN
             1            3            3          NaN
             1          NaN          NaN          NaN
             2            2          NaN          NaN
             1          NaN          NaN          NaN
             1            3            2            3
             1          NaN          NaN          NaN
            ')
    datam
    sum(rowSums(datam == 3, na.rm=TRUE) > 0)
    [1] 7
    

    【讨论】:

    • +1;我认为您的第一个 na.rm 是唯一需要的。
    • 我认为这对于 300 行或更多行来说太复杂了。
    【解决方案2】:

    也许不是最优雅的解决方案,但您可以使用sapply 来获取每行中是否有 3,然后使用sum 来计算符合该条件的行数:

    sapply(1:nrow(df), function(row) 3 %in% df[row,])
    # [1]  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE
    # [13] FALSE  TRUE FALSE
    sum(sapply(1:nrow(df), function(row) 3 %in% df[row,]))
    # [1] 7
    

    【讨论】:

    • 这似乎是一种可能性,因为结果也是 10。
    • 对不起,我使用了错误的数据。这些也不起作用,因为我得到了 97 的结果。
    【解决方案3】:

    您对多个 OR 条件的使用建议了这种方法:

    > sum( apply(datam, 1, function(x) any(x==3) ), na.rm=TRUE)
    [1] 7
    

    【讨论】:

    • sum(apply(datam == 3, 1, any, na.rm = T)),除了保存匿名函数声明之外没有太大区别。
    • 好;我原本以为apply(datam, 1, any, cond) 结尾是:eq3 &lt;- function(x) any(x==3) ; sum( apply(datam,1,eq3), na.rm=TRUE),这似乎太巴洛克了。
    • 用我的公式我得到 10 的结果。用 BondedDust 的公式我得到 38 和 BrodieG 97!
    • Post str(dataset):我的猜测是你有因素,并且通过对数字的隐式强制得到奇怪的结果。您可以通过将条件更改为 x="3" 来检查这一点。
    • 我的变量是数字,见下文。 > str(datam)'data.frame':220 ob​​s。 73 个变量:$ center:num 4 4 4 4 4 4 4 4 4 4 ... $grade_chir_1:num 1 1 NaN 2 2 2 1 1 1 1 ... $grade_chir_2:num NaN NaN 2 NaN NaN NaN NaN。 .. $grade_chir_3 : num NaN NaN NaN NaN NaN NaN NaN ... $grade_d_chir : num NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...'
    【解决方案4】:

    更好的是:

    table(datam$grade_chir_1 == 3 | datam$grade_chir_2==3 | datam$grade_chir_3==3 | datam$grade_d_chir==3)
    TRUE 
    10 
    

    但还是不尽如人意。

    还有这个解决方案:

    sum(datam$grade_chir_1 == 3 | datam$grade_chir_2==3 | datam$grade_chir_3==3 | datam$grade_d_chir==3, na.rm=T)
    [1] 10
    

    【讨论】:

      猜你喜欢
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多