如何将两个频率表的内容组合成R中的一个频率表?

时间:2018-06-05 20:55:19

标签: r data.table

我有一个关于如何将两个频率表组合成一个频率表的问题。

所以,如果我有两张桌子:

table1:

    Col1
    18
    19
    17
    19
    13
    19

table2:

    Col1
    18
    19
    12
    15
    18

我想制作第3个表格table3,以便table3$"Col2"计算table3$"Col1"table1$"Col1"中的数字出现的次数,以便table3$"Col3" table3$"Col1"计算table2$"Col1"

table3$"Col1"中出现的数字的次数

table1$"Col1"table2$"Col2"table3: Col1 Col2 Col3 12 0 1 13 1 0 15 0 1 17 1 0 18 1 2 19 3 1

中所有元素的列表
table3$"Col1"<-table(table1$"Col1",table2$"Col1")

我最初尝试这样做: table1$"Col1"但它不起作用,因为table2$"Col1"Error in table(table1$"Col1", table2$"Col1") : all arguments must have the same length的长度不同:

RANK()

3 个答案:

答案 0 :(得分:2)

这是另一种选择:

f <-function(x,y) sum(x %in% y)
V1 <- sort(unique(c(table1$'Col1', table2$'Col1')))
V2 <- sapply(V1,f,x = Col1)
V3 <- sapply(V1,f,x = Col2)
> data.frame(V1,V2,V3)
  V1 V2 V3
1 12  0  1
2 13  1  0
3 15  0  1
4 17  1  0
5 18  1  2
6 19  3  1

答案 1 :(得分:1)

这是另一个dplyr解决方案。

首先,我加载库。

library(dplyr)
library(magrittr)

接下来,我使用table计算两个表中的每个元素,然后执行完全连接。每个表中缺少的元素将显示为NA

df <- full_join(data.frame(table(table1)), 
                data.frame(table(table2)), 
                by = c("table1" = "table2"))

最后,我用零替换NA,重命名列,并根据第一列进行排序。

df %<>% 
  replace(is.na(.), 0) %>% 
  rename_all(funs(paste("Col", 1:3, sep = ""))) %>% 
  arrange(Col1)

#   Col1 Col2 Col3
# 1   12    0    1
# 2   13    1    0
# 3   15    0    1
# 4   17    1    0
# 5   18    1    2
# 6   19    3    1

答案 2 :(得分:0)

我打算使用tidyverse解决方案。也许有一种基础R方法也可以起作用。

library(tidyverse)

table1 <- read.table(text = "    Col1
    18
                     19
                     17
                     19
                     13
                     19", header = TRUE)

table2 <- read.table(text = "    Col1
    18
                     19
                     12
                     15
                     18", header = TRUE) 

首先,我们希望获得Col1 table3列的所有可能选项的列表。

table3 <- data.frame(Col1 = (unique(c(table1$Col1, table2$Col1))))

然后我们使用count中的dplyr函数来获取table1table2中每个观察的实例数。请注意,count会返回名为n的列,以表示每个观察的计数。我将其重命名为与最终table3中的列名匹配。

df1 <- table1 %>% 
    count(Col1) %>% 
    rename(Col2 = n)
df2 <- table2 %>% 
    count(Col1) %>% 
    rename(Col3 = n)

最后,我们将所有这些与left_join一起加入,然后用0替换缺失值。

table3 <- table3 %>% 
    left_join(df1, by = "Col1") %>% 
    left_join(df2, by = "Col1") %>% 
    mutate(Col2 = ifelse(is.na(Col2), 0, Col2), 
           Col3 = ifelse(is.na(Col3), 0, Col3)) %>% 
    arrange(Col1)

> table3
  Col1 Col2 Col3
1   12    0    1
2   13    1    0
3   15    0    1
4   17    1    0
5   18    1    2
6   19    3    1