RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 586979
Accepted
mr.T
mr.T
Asked:2020-11-05 14:37:49 +0000 UTC2020-11-05 14:37:49 +0000 UTC 2020-11-05 14:37:49 +0000 UTC

如何按条件从数据中隔离出某组数据

  • 772

有一个带有数据的数据框

dat
  cluster1 cluster2 cluster3 cluster4 cluster5 target.label
1        24        5       18       21       16            1
2         2       15       12        7       22            1
3        13       13       16       29       24            0
4        23       28       22       10        4            1
5         6       12       20       25       11            0
6        25       17       14       24       25            1
7        30       27        2        4       14            0
8        11        2       21        6        9            0
9        20       20       29       17       10            1
10        7       30       25       11       15            0
11       19        8       15        8       18            0
12        3       18        1       16       26            0
13       17        9       23       14        8            0
14        5        6        5       22       19            0
15        9       19        9       12       20            1
16       21        3        3       13       23            1
17       10       16        4       26        2            1
18       18        4       28        3        6            0
19       28       24        7       20       12            0
20        8       11       11       23        7            1
21       15       14        6       27       27            0
22       26       29       26       28       29            1
23       16        1       10        2       17            0
24        1        7       17       15       21            0
25       27       23       30        5       13            1
26       12       22       19        9       30            1

在数据中,我们有簇的列,每个簇的范围为 1 到 30,最后一列的目标值可以为 0 或 1

你需要在整个样本中找到至少重复10次的这样的线,并且在每个找到的重复的相同组中,target.label中“1”的数量相对于“0”必须超过70%

像这样

cluster1 cluster2 cluster3 cluster4 cluster5  target.label
1        24        5       18       21       16            1
2        24        5       18       21       16            1
3        24        5       18       21       16            0
4        24        5       18       21       16            1
5        24        5       18       21       16            1
6        24        5       18       21       16            1
7        24        5       18       21       16            1
8        24        5       18       21       16            0
9        24        5       18       21       16            1
10       24        5       18       21       16            1
.....
.....
......

这是找到的大于零的相同行......

这是如何实现的,重要的是它要尽可能快,因为会有很多这样的计算

r
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    ikashnitsky
    2020-11-17T05:23:24Z2020-11-17T05:23:24Z

    这是一个更优雅的解决方案。最重要的是,只使用 packagesdplyr和tidyr,这可能确保了最大的执行速度。代码中的所有进一步注释。

    library(tidyverse) # это удобный способ подгрузить сразу весь мир пакетов Hadley 
    
    # создаем данные, подходящие по описанию - миллион наблюдений
    df_raw <- data_frame(cluster1 = sample(0:9,1e6,replace = T),
                         cluster2 = sample(0:9,1e6,replace = T),
                         cluster3 = sample(0:9,1e6,replace = T),
                         cluster4 = sample(0:9,1e6,replace = T),
                         cluster5 = sample(0:9,1e6,replace = T),
                         target.label = sample(0:1,1e6,replace = T))
    
    # создаем переменную со всей последовательностью
    df <- df_raw %>% unite(seq, cluster1:cluster5, sep = '-', remove = F) 
    
    
    df_count <- df %>% select(seq,target.label) %>%
            group_by(seq) %>% # группируем по последовательностям
            summarise(size = n(), # размер группы (сколько раз встречается последовательность)
                      target = sum(target.label), # просто суммируем 
                      share = target/size) %>% # считаем долю единиц
            ungroup()
    
    # отбираем последовательности, которые удовлетворяют заданному условию
    df_cond <- df_count %>% filter(size >= 10, share >=.7)
    
    # если надо, можно слить результат с исходной таблицей, чтобы знать, какие конкретно
    # наблюдения удовлетворяют условию
    df_back <- left_join(df, df_cond %>% transmute(seq, cond = 'yes'), by = 'seq') %>%
             replace_na(replace = list(cond = 'no')) # (UPD) заменить пустые значения на 'no'
    
    • 4
  2. Roman Sidorin
    2020-11-10T02:10:29Z2020-11-10T02:10:29Z

    下面是解决问题的代码片段。检查。

    # основная идея на основании заданного дата фрэйма создать новый в котором посчитано
    # для уникального сочетания строк по полям cluster1, cluster2, ... 
    # количество с 0-ми, 1-ми и общее количество строк
    # исключаем строки не удовлетворяющие требуемым условиям и в дальнейшем новый дата фрэйм
    # используем как эталон для выборки из заданного дата фрэйма
    library(dplyr)
    # файл с данными 
    data.file <- "/home/UserName/Документы/questions_586979/dtfrm.csv"
    Mx.Sz <- 2     #10 - переменная для граничного условия "нужно найти такие строчки которые повторяются не менее 10 раз в всей выборке"
    # для прогона тестового примера определяем 2
    Mx.Prcnt <- 60     # переменная для граничного условия "в каждой из найденных одинаковых групок которые повторялись, количество "1" 
    # в target.label должно превышать 70% по отношению к "0"
    # для прогона тестового примера определяем 60%
    # открываем файл с данными
    df <- read.csv2(data.file)
    # создаем два дополнительных столбца, по количеству возможныйх значений в target.label
    # trgt.lbl.0 и заполняем 1 если значение target.label = 0
    # trgt.lbl.1 и заполняем 1 если значение target.label = 1
    df.tmp1 <- mutate(df, cluster1, cluster2, cluster3, cluster4, cluster5, 
                      trgt.lbl.0 = ifelse(target.label == 0, 1, 0), 
                      trgt.lbl.1 = ifelse(target.label == 1, 1, 0))
    # производим группировку по полям cluster1, cluster2,... 
    df.tmp2 <- group_by(df.tmp1, cluster1, cluster2, cluster3, cluster4, 
                                cluster5)
    # суммируем по столбцам trgt.lbl.0, trgt.lbl.1 для определения количества 0 и 1 в строке 
    # далее используем для определения % соотношения количества строк с 1 к общему количеству строк
    # для уникального сочетания cluster1, cluster2 ...
    # определяем количество строк с уникальным сочетанием значений по полям cluster1, cluster2 ...
    # далее количество строк используем для исключения строк не удовлетворяющий условию Mx.Sz
    df.tmp3 <- summarise(df.tmp2, sm.0 = sum(trgt.lbl.0), 
                                  sm.1 = sum(trgt.lbl.1), 
                                  all.rc = n())
    # создаем поле sm.1.prcnt - значение которого показывает количество % строк с 1-ми к общему количеству
    # для уникального сочетания cluster1, cluster2 ...
    df.tmp4 <- mutate(df.tmp3, sm.1.prcnt = sm.1*100/all.rc)
    # исключаем строки не удовлетворяющих нашим граничным условиям
    # по общему количеству строк и процентному соотношению строк с 1-ми
    # в результате получили дата фрэйм содержащий необходимые нам строки
    df.tmp5 <- filter(df.tmp4, all.rc >= Mx.Sz & sm.1.prcnt >= Mx.Prcnt)
    
    # в цикле на основании строк, удовлетворяющих требованиям, выбираем строки из исходного дата фрэйма 
    # с последующей записью в файл
    for (i in 1:nrow(df.tmp5)) {
      # результирующий дата фрэйм
      df.tmp6 <- filter(df, as.integer(cluster1) == as.integer(df.tmp5[i, 1]) &
                            as.integer(cluster2) == as.integer(df.tmp5[i, 2]) &
                            as.integer(cluster3) == as.integer(df.tmp5[i, 3]) &
                            as.integer(cluster4) == as.integer(df.tmp5[i, 4]) &
                            as.integer(cluster5) == as.integer(df.tmp5[i, 5]))
      # имя результирующего дата фрэйма
      nm.rslt <- paste0("nm.rslt.",i, ".csv")
      # записываем результат
      write.csv(df.tmp6, file = nm.rslt, row.names=FALSE)
    }
    
    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5