【问题标题】:R: Replace Column Name with Row Name on Bases of a Value in Data FrameR:根据数据框中的值将列名替换为行名
【发布时间】:2016-10-25 22:06:56
【问题描述】:

我有一个数据框如下:

df <- data.frame(halloo = c(0.04,1,1,1), ciaoo = c(1,0.05,1, 1), bird=c(1,1,1,1))
row.names(df) <- c("hallo", "ciao", "else", "some")

在这里,我想检查单元格中的值是否低于/等于 0.05,如果是这种情况,那么我想通过相关单元格的行名来更改列名。

应用函数后,最终的数据框应如下所示:

df.final <- data.frame(hallo = c(0.04,1,1,1), ciao = c(1,0.05,1, 1), bird=c(1,1,1,1))
row.names(df.final) <- c("hallo", "ciao", "else", "some")

实际上,虽然我试图找到一种解决方案,但我不知道好的解决方案。有人有想法吗?

提前谢谢

【问题讨论】:

    标签: r replace


    【解决方案1】:

    我们可以使用whicharr.ind=TRUE 从逻辑矩阵(df &lt;= 0.05)中得到row/column 索引矩阵。子集列向量('i2'),删除重复项('i3' - 因为一列中可能有不止一行满足条件),将基于'i3'的'df'的列名分配给names 的“i3”。

     i1 <- which(df <= 0.05, arr.ind=TRUE)
     i2 <-  i1[, 2]
     i3 <- i2[!duplicated(i2)]
     names(df)[i3] <- names(i3)
    

    【讨论】:

      【解决方案2】:

      我严重依赖下标和函数来解决很多问题,所以这里有一个替代方案:

      bool <- df <= 0.05
      bool <- as.data.frame(bool)
      x <- pryr::compose(unlist, lapply)(
          bool,
          function(x) row.names(bool[x, TRUE][1])
          # [1] to handle duplicates - just pull row name of first match
      )
      names(df)[1:length(x)] <- x
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-30
        • 2012-07-16
        • 1970-01-01
        • 2021-09-07
        相关资源
        最近更新 更多