【问题标题】:How to perform operation on columns using column indexes (and not names) of a data frame using dplyr?如何使用 dplyr 使用数据框的列索引(而不是名称)对列执行操作?
【发布时间】:2019-11-25 15:10:34
【问题描述】:

我正在尝试更广泛地使用 dplyr,并且对使用列索引而不是列名的(按行)操作有疑问。在我的工作流程中,我有数据表,其中第一列是 char() 标识符,最后一列也是 char() 数据类型。第一个和最后一个之间的所有列都包含将用于操作的数值 - 在此示例中:按丰度排序并仅保留 5 个更丰富的行。

这是一个使用经典 R 的示例:

example_file = "~/path/my/data/example_table.tsv"
df = data.frame(fread(example_file, header=TRUE), check.names=FALSE)
df$sum = rowSums(df[,2:(ncol(df)-1)])
df = df[order(-df$sum),]
df = df[1:5,]

这是我的 df 的 dput 输出:

df <- structure(list(feature = 1111:1117, A = c(2L, 1L, 0L, 1L, 11L, 
1L, 0L), B = c(1L, 0L, 1L, 2L, 1L, 1L, 10L), C = c(0L, 1L, 2L, 
0L, 2L, 2L, 1L), D = c(1L, 3L, 3L, 3L, 1L, 3L, 3L), E = c(4L, 
4L, 3L, 4L, 4L, 3L, 4L), F = c(1L, 0L, 0L, 1L, 1L, 1L, 2L), G = c(1L, 
2L, 2L, 2L, 21L, 4L, 2L), H = c(6L, 7L, 4L, 7L, 7L, 7L, 1L), 
    taxonomy = c("Eukaryota;Centrohelida;H15-6", "Eukaryota;Excavata;Discoba;Discicristata;Euglenozoa;Diplonemea;Rhynchopus", 
    "undef", "Eukaryota;Excavata;Discoba;Discicristata;Euglenozoa;Euglenida;Heteronematina", 
    "Eukaryota;Excavata;Discoba;Discicristata;Euglenozoa;Euglenida;Heteronematina", 
    "Eukaryota;Excavata;Discoba;Discicristata;Euglenozoa;", "Eukaryota;SAR;Alveolata;Ciliophora;Intramacronucleata"
    )), class = "data.frame", row.names = c(NA, -7L))

我的问题很简单:如何使用 dplyr 范式实现上述代码?我直觉地在寻找一种使用列索引来操作 df 的方法——就像我在上面的代码块中所做的那样——但没有找到任何令人满意的答案。

任何指导将不胜感激。

【问题讨论】:

    标签: r sorting dplyr


    【解决方案1】:

    一种方法如下:

    library(tidyverse)
    
    df %>% 
      group_by(feature, taxonomy) %>% 
      nest() %>% 
      mutate(sumz = map(data, rowSums)) %>%
      unnest(c(data, sumz)) %>% 
      arrange(-sumz) %>% 
      slice(1:5)
    

    这里我nest 特征和分类法基本上创建了一个值向量。然后我使用mutate 函数添加一个名为 sumz 的新列(而不是 sum,这样我就不会弄乱函数名称)。我将rowSums 函数映射到嵌套数据中。然后我取消嵌套以返回一个数据框并使用arrangeslice,类似于您在上面所做的。如果您对前 5 个单元感兴趣,您可以使用 top_n 函数来选择那些。

    关于数字引用的问题,您可以使用 dplyr esque 语法。您还可以使用 ****_if 函数(如 group_by_if(is.character) 等)根据您提供的逻辑应用函数。

    【讨论】:

      猜你喜欢
      • 2015-12-13
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 2021-05-03
      • 2013-04-17
      • 2016-10-09
      • 2018-12-09
      相关资源
      最近更新 更多