【问题标题】:Subset R data.frame by column name with hyphen "-" in name (using dplyr)按名称中带有连字符 \"-\" 的列名称对 R data.frame 进行子集化(使用 dplyr)
【发布时间】:2023-01-14 01:57:50
【问题描述】:

我有一个模型输出,它是一个包含 1 列和多行的矩阵。 矩阵列名称取决于输入条件对,类似于“St1-St2”。 列值可能是 0 或 1 或 -1。

我想过滤值 != 0。

# matrix example
mat1.data <- c(1,0,0,0,1,-1,-1,0,1)
m_rownames <- c("g1", "g2", "g3", "g4", "g5", "g6", "g7", "g8", "g9")
mat1 <- matrix(mat1.data, nrow=9,ncol=1,byrow=TRUE)
colnames(mat1) <- "St1-St2"
rownames(mat1) <- m_rownames

mat1

# get column name
m_column <- colnames(mat1) 

# try to filter using rlang's injection 
mat2 <- data.frame(mat1) %>% 
  dplyr::filter(!!as.symbol(m_column) != 0) %>% 
  rownames_to_column()

如何处理列名中的连字符?

评估代码后出现错误:

#> Error in `dplyr::filter()`:
#> ! Problem while computing `..1 = `St1-St2`type here != 0`.
#> Caused by error in `mask$eval_all_filter()`:
#> ! object 'St1-St2' not found
#> Run `rlang::last_error()` to see where the error occurred.

【问题讨论】:

    标签: r dplyr filter


    【解决方案1】:

    使用as.data.frame而不是data.frame,因为data.frame调用make.unique检查列名,并且由于列名有一些-字符,它被更改为.。使用as.data.frame,它保持原样(否则必须调用check.names = FALSE

    library(dplyr)
    as.data.frame(mat1) %>% 
      dplyr::filter(!!as.symbol(m_column) != 0) %>% 
      rownames_to_column()
    

    -输出

       rowname St1-St2
    1      g1       1
    2      g5       1
    3      g6      -1
    4      g7      -1
    5      g9       1
    

    【讨论】:

      猜你喜欢
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      相关资源
      最近更新 更多