我有一个关于如何将两个频率表组合成一个频率表的问题。
所以,如果我有两张桌子:
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()
答案 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
函数来获取table1
和table2
中每个观察的实例数。请注意,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