【问题标题】:Filter rows by value unless no row meet condition按值过滤行,除非没有行满足条件
【发布时间】:2021-05-31 00:38:49
【问题描述】:

在 R 中,我有以下数据集,如果 Per

df <- cbind(c("D1", "D1", "D1", "D1", "D2", "D2", "D2", "D2", "D3", "D3", "D3", "D3"), c(99.8, 99.5, 98.7, 98, 97.8, 97.3, 96, 95.9, 95, 94.9, 94.5, 94), c("sp", "sp", "sp", "sp", "sp", "sp", "sp", "sp", "sp", "sp", "sp", "sp")) colnames(df) <- cbind("A", "Per", "B")

预期的结果是

df <- cbind(c("D1", "D1", "D1", "D1", "D2", "D3"), c(99.8, 99.5, 98.7, 98, 0, 0), c("sp", "sp", "sp", "sp", "sp", "sp")) colnames(df) <- cbind("A", "Per", "B")

【问题讨论】:

    标签: r select matrix conditional-statements submatrix


    【解决方案1】:

    这应该可以解决问题。

    library(dplyr)
    df2=as.data.frame(df, stringsAsFactors=FALSE) %>% mutate(Per=as.numeric(Per))
    j=1
    for (i in 1:nrow(df2)) {
      print(i)
      if ((sum(df2$A==df2[j,"A"])==1) & (df2[j,"Per"]<98)) {
        df2[j, "Per"]=0
      } else if (df2[j,"Per"] < 98) {
        df2=df2[-j,]
        next
      }
      j=j+1
    }
    df2
    
        A  Per  B
    1  D1 99.8 sp
    2  D1 99.5 sp
    3  D1 98.7 sp
    4  D1 98.0 sp
    8  D2  0.0 sp
    12 D3  0.0 sp
    

    如果需要是矩阵,

    df2=as.matrix(df2)
    

    【讨论】:

    • 非常感谢。这是有效的。对于我的真实数据库,我需要使用 mutate(Per=as.numeric(as.character(Per))。否则无法正确识别数字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2022-12-21
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多