【问题标题】:Calculate percentage of common values between a column and a list, based on categories in another column with R使用 R 根据另一列中的类别计算列和列表之间常见值的百分比
【发布时间】:2022-01-23 04:39:23
【问题描述】:

我非常坚持这个练习,所以如果有人能对此有所了解,我将不胜感激。我有一个包含两列的 dataframe,如下例所示:

V1 V2
100100 rs-1
100100 rs1597782599
100100 rs1603359091
100100 rs1603359205
100300 rs372751467
100300 rs3732413
100300 rs387907031
100300 rs9852894
100800 rs-1
100800 rs121913114
100800 rs144995231
100800 rs17883400
100800 rs761325047
101000 rs1060503667
101000 rs1060503668
101000 rs1060503669
101000 rs1060503670
101000 rs1060503671

以及dataset$V2 中的rs 代码列表

我想要得到的是第 2 列和列表之间常见 rs 代码的百分比,但按 dataset$V1 中的代码分组。例如:

V1 Common %
100100 25%
100300 40%
100800 50%
101000 100%

我尝试了几个选项,但都没有成功。例如,我正在尝试使用 tidyverse group_by(dataframe$V1) 选项,但我不确定如何连接共同百分比的估计。

提前谢谢大家!

【问题讨论】:

    标签: r dataframe overlap


    【解决方案1】:

    我猜dataframe2'的结构:

    set.seed(42)
    dataframe2 <- dataframe[sample(nrow(dataframe), size=10),]
    dataframe2
    #        V1           V2
    # 17 101000 rs1060503670
    # 5  100300  rs372751467
    # 1  100100         rs-1
    # 9  100800         rs-1
    # 10 100800  rs121913114
    # 4  100100 rs1603359205
    # 2  100100 rs1597782599
    # 14 101000 rs1060503667
    # 16 101000 rs1060503669
    # 8  100300    rs9852894
    

    基础 R

    tmp <- merge(transform(dataframe2, orig=TRUE), dataframe, by = c("V1", "V2"), all = TRUE)
    
    aggregate(orig ~ V1, data = tmp, FUN = function(z) {100 * sum(!is.na(z)) / length(z);}, na.action = NULL)
    #       V1 orig
    # 1 100100   75
    # 2 100300   50
    # 3 100800   40
    # 4 101000   60
    

    dplyr

    library(dplyr)
    dataframe2 %>%
      mutate(orig = TRUE) %>%
      full_join(., dataframe, by = c("V1", "V2")) %>%
      group_by(V1) %>%
      summarize(common = 100 * sum(!is.na(orig)) / n()) %>%
      ungroup()
    # # A tibble: 4 x 2
    #       V1 common
    #    <int>  <dbl>
    # 1 100100     75
    # 2 100300     50
    # 3 100800     40
    # 4 101000     60
    

    【讨论】:

    • 这个解决方案完全帮助了我。非常感谢!
    • 由于您是新来的 SO:如果答案解决了您的问题,请accept it 有几个原因。不用着急,一个常见的策略是将问题保留一到三天以获取可能的其他答案/方法,但请记住回来接受。 (如果仍然需要某些东西,您需要说出来并明确指出错误/不同之处。)谢谢!
    猜你喜欢
    • 2021-09-13
    • 1970-01-01
    • 2016-07-31
    • 2021-11-12
    • 2022-01-23
    • 1970-01-01
    • 2021-03-16
    • 2019-08-14
    • 1970-01-01
    相关资源
    最近更新 更多