首页 > 解决方案 > 根据来自 R 中另一个的信息,将具有计数总和的新列添加到数据帧

问题描述

我需要帮助才能将计数列添加到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$Groupand中找到,其想法是针对(用逗号分隔)中的tab2$Event行中的每个元素,计算其中AND中的行数,然后将此计数添加到名为 的新列中的tab1中。tab1tab2VALUE1 < 10VALUE2 > 30Sum_count

这是 tab2

  Group Event VALUE1 VALUE2
1    G1     1      5     50  <- VALUE1 < 10 & 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 & VALUE2 > 30 : count 1 
7    G5     7      1     70  <- VALUE1 < 10 & VALUE2 > 30 : count 1 
8    G5     8      4     67  <- VALUE1 < 10 & VALUE2 > 30 : count 1 
9    G5     9      3     60  <- VALUE1 < 10 & VALUE2 > 30 : count 1 

例子 :

这是预期的结果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))

标签: rdataframedplyrmergedatatable

解决方案


你可以尝试一个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 & 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

推荐阅读