#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 Другой столбец, который мне нужно сохранить в выводе, но который специально не участвует в процессе?