【问题标题】:Return the column name for the last value <> NA in row返回行中最后一个值 <> NA 的列名
【发布时间】:2018-11-13 13:50:30
【问题描述】:

我有一个数据框,其中包含评分为 1-7 的状况评估(作为列名)。每个观察都包含每个条件等级 (1-7) 的代表性区域(百分比)。对于每个观察,每一行的总和应为 100%。

我能够返回对应的条件等级(列名中的 1-7)以获得最高 % 覆盖率,以显示该区域的大部分是条件 x。

这是我的代码:

# Create some data:
    set.seed(10)
    df <- matrix(round(rbeta(100*7,1,1),digits=1), nc=7)
    df <- round(sweep(df, 1, rowSums(df), FUN="/"),digits=1)
    colnames(df)<-c(1:7) # Change the column names to reflect condition value
    df <- as.data.frame(df)

# Now return the condition corresponding to the highest % coverage 
    df$maxPercCond <- as.numeric(colnames(df)[max.col(df,ties.method="last")])
    df[df == 0] <- NA # Need to keep this as actual data contains NA values

我的问题

我需要为每一行返回峰值条件 (pkVal)。

    df[c(5,70),]

     1   2   3   4   5   6   7      maxPercCond pkVal  | pkVal(REQUIRED)
  5  0.1 0.2 0.2 0.1 0.2 0.1  NA    5           0.1    | 6
  70 0.2 0.2 0.1 0.2 0.1 NA   0.1   4           0.1    | 7

在上面的例子中,pkVal 应该分别等于 6 和 7(根据我的手册 pkVal(REQUIRED) 条目,显示 6 是第一行的最高额定条件,7 是第二行的最高额定条件。

我一直在尝试对maxPerCond 分配进行变体,但遇到了麻烦!欢迎任何建议/帮助:

 df$pkVal <- as.numeric(colnames(df)[max.col(df[cbind( 1:nrow(df),
 max.col(!is.na(df[,1:7]),"last") )],ties.method="last")])

【问题讨论】:

    标签: r


    【解决方案1】:

    一种选择可能是在行模式下使用apply,并找到对应的最后一个元素的列名等于NA

    apply(df, 1, function(x) { tail(names(x)[!is.na(x)], n=1) })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      相关资源
      最近更新 更多