Добавьте новый столбец с суммой количества в фрейм данных в соответствии с информацией из другого в R

#r #dataframe #dplyr #merge #datatable

Вопрос:

Мне понадобится помощь, чтобы добавить столбец count в таблицу, называемую tab1 в соответствии с другой tab2 .

Вот первая вкладка :

табл. 1

     Event_Groups Other_column
1      1_G1,2_G2            A
2           2_G1            B
3           4_G4            C
4 7_G5,8_G5,9_G5            D
 

как вы можете видеть в Event_Groups столбце, у меня есть 2 информации ( Event и Groups цифры, разделенные буквой «_»). Эта информация также будет найдена в tab2$Group и tab2$Event , и идея состоит в том, чтобы для каждого элемента в строках в tab1 (разделенных запятой) подсчитать количество строк в tab2 where VALUE1 < 10 И VALUE2 > 30 , а затем добавить это количество в tab1 в новом столбце под названием Sum_count .

Вот вкладка 2

   Group Event VALUE1 VALUE2
1    G1     1      5     50  <- VALUE1 < 10 amp; VALUE2 > 30 : count 1  
2    G1     2     6      20  <- VALUE2 < 30  : count 0 
3    G2     2     50     50  <- VALUE1 > 10  : count 0
4    G3     3      0      0
5    G4     1      0      0
6    G4     4      2     40  <- VALUE1 < 10 amp; VALUE2 > 30 : count 1 
7    G5     7      1     70  <- VALUE1 < 10 amp; VALUE2 > 30 : count 1 
8    G5     8      4     67  <- VALUE1 < 10 amp; VALUE2 > 30 : count 1 
9    G5     9      3     60  <- VALUE1 < 10 amp; VALUE2 > 30 : count 1 
 

Пример :

  • Например, для первого элемента строки 1 в таблице 1: 1_G1 мы видим в таблице 2 (строка 1), что ЗНАЧЕНИЕ 1 < 10 и ЗНАЧЕНИЕ 2 > 30>, поэтому я считаю 1.
  • Для второго элемента (строка 1) : 2_G2 мы видим в таблице 2 (строка 3), что ЗНАЧЕНИЕ 1 > 10>, поэтому я считаю 0.

И вот ожидаемый результат tab1 фрейм данных;

 Event_Groups     Other_column Sum_count
1_G1,2_G2        A            1
2_G1             B            0
4_G4             C            1
7_G5,8_G5,9_G5   D            3
 

Я не знаю, достаточно ли я ясен, не стесняйтесь задавать вопросы.


Вот две таблицы в формате dput, если это может помочь:

табл. 1

 structure(list(Event_Groups = structure(1:4, .Label = c("1_G1,2_G2", 
"2_G1", "4_G4", "7_G5,8_G5,9_G5"), class = "factor"), Other_column =
structure(1:4, .Label = c("A",  "B", "C", "D"), class = "factor")),
class = "data.frame", row.names = c(NA, 
-4L))
 

табл. 2

 structure(list(Group = structure(c(1L, 1L, 2L, 3L, 4L, 4L, 5L, 
5L, 5L), .Label = c("G1", "G2", "G3", "G4", "G5"), class = "factor"), 
    Event = c(1L, 2L, 2L, 3L, 1L, 4L, 7L, 8L, 9L), VALUE1 = c(5L, 
    6L, 50L, 0L, 0L, 2L, 1L, 4L, 3L), VALUE2 = c(50, 20, 50, 
    0, 0, 40, 70, 67, 60)), class = "data.frame", row.names = c(NA, 
-9L))
 

Ответ №1:

Вот один из способов сделать это:

 library(dplyr)
library(tidyr)

tab1 %>% 
  mutate(Event_Groups = as.character(Event_Groups)) %>% 
  separate_rows(Event_Groups, sep = ",") %>% 
  left_join(., 
            tab2 %>% 
              unite(col = "Event_Groups", Event, Group) %>% 
              mutate(count = if_else(VALUE1 < 10 amp; VALUE2 > 30,1L, 0L))) %>%
  group_by(Other_column) %>% 
  summarise(Event_Groups = paste(unique(Event_Groups), collapse = ","),
            Sum_count = sum(count)) %>% 
  select(Event_Groups, everything())

#> Joining, by = "Event_Groups"
#> `summarise()` ungrouping output (override with `.groups` argument)
#> # A tibble: 4 x 3
#>   Event_Groups   Other_column Sum_count
#>   <chr>          <fct>            <int>
#> 1 1_G1,2_G2      A                    1
#> 2 2_G1           B                    0
#> 3 4_G4           C                    1
#> 4 7_G5,8_G5,9_G5 D                    3
 

Создано 2021-07-29 пакетом reprex (v0.3.0)

Комментарии:

1. Большое вам за это спасибо ! что делать, если у меня есть mutliple Другой столбец, который мне нужно сохранить в выводе, но который специально не участвует в процессе?

2. Можете ли вы попытаться добавить их все в group_by то, что у нас есть только Other_column сейчас? Если у вас есть много других переменных, которые вы можете использовать across внутри group_by .

3. Да, конечно, просто еще один вопрос: почему вы включили 1L, 0L линию мутантов ?

4. 0L и 1L являются частью ifelse , но вы могли бы использовать as.numeric вместо ifelse утверждения, тогда вам не понадобилось 0L бы и 1L .

Ответ №2:

Вы можете попробовать tidyverse

 library(tidyverse)

tab1 %>% 
  rownames_to_column() %>% 
  separate_rows(Event_Groups, sep = ",") %>% 
  separate(Event_Groups, into =  c("Event", "Group"), sep="_", convert = T) %>% 
  left_join(tab2 %>% 
             mutate(count = as.numeric(VALUE1 < 10 amp; VALUE2 > 30)), 
            by = c("Event", "Group")) %>% 
  unite(Event_Groups, Event, Group) %>% 
  group_by(rowname)  %>% 
  summarise(Event_Groups = toString(Event_Groups),
            Other_column = unique(Other_column),
            count =sum(count))
# A tibble: 4 x 4
  rowname Event_Groups     Other_column count
  <chr>   <chr>            <chr>        <dbl>
1 1       1_G1, 2_G2       A                1
2 2       2_G1             B                0
3 3       4_G4             C                1
4 4       7_G5, 8_G5, 9_G5 D                3
 

Комментарии:

1. Большое вам спасибо за вашу помощь, что делать, если у меня есть mutliple Другой столбец, который мне нужно сохранить в выводе, но который специально не участвует в процессе?