【问题标题】:For each line of a Data.Frame, get the column name where a value is TRUE对于 Data.Frame 的每一行,获取值为 TRUE 的列名
【发布时间】:2014-12-30 07:37:21
【问题描述】:

我有一个 data.frame L1States_df,看起来像这样:

  BoltOn CutOn IdleOn PumpOn
1  FALSE FALSE  FALSE  FALSE
2  FALSE FALSE   TRUE  FALSE
3  FALSE FALSE   TRUE  FALSE
4  FALSE FALSE   TRUE  FALSE
5  FALSE FALSE   TRUE  FALSE
6  FALSE FALSE  FALSE   TRUE

对于L1States_df 的每一行,可以有一个或没有(零)TRUE,其余为FALSE。 我想为每一行创建一个新向量:

  • 与 TRUE 关联的列的名称(如果该行上有 TRUE)
  • 如果此行没有任何 TRUE,则不适用

所需输出示例:

   State
 1 NA
 2 "IdleOn"
 3 "IdleOn"
 4 "IdleOn"
 5 "IdleOn"
 6 "PumpOn"

我试过了:

apply(L1States_df,1,function(x) names(which(x==TRUE)))

但是当在线上没有TRUE 时不会生成NA,所以我放了一个IFELSE

apply(L1States_df,1,function(x) ifelse(is.null(names(which(x==TRUE))),NA,names(which(x==TRUE))))

有没有更好/更快的方法,或者是否有一个预定义的函数可以做这种事情(可能是data.table)?

加分:虽然它不应该发生,只是为了安心:如果在特定行上有多个 TRUE,我怎么能生成 NA?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    这是一个矢量化的可能解决方案(apply 中不需要)

    indx <- which(L1States_df == TRUE, arr.ind = TRUE)
    names(L1States_df)[indx[match(seq_len(nrow(L1States_df)), indx[, 1]), 2]]
    ## [1] NA       "IdleOn" "IdleOn" "IdleOn" "IdleOn" "PumpOn"
    

    【讨论】:

      【解决方案2】:

      另一种可能是

      m <- as.matrix(mydf)
      replace(NA, row(m)[m], colnames(m)[col(m)[m]])
      # [1] NA       "IdleOn" "IdleOn" "IdleOn" "IdleOn" "PumpOn"
      

      对于奖励积分,您可以使用match 在具有多个 TRUE 的行上生成 NA

      match(rowSums(mydf) > 1, TRUE)
      # [1] NA NA NA NA NA NA
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-31
        • 2021-01-30
        • 1970-01-01
        • 2021-12-06
        • 1970-01-01
        相关资源
        最近更新 更多