我有两个向量,它们的索引看起来像
index A index B
1 1
1 1
1 1
1 2
1 2
2 1
2 1
现在,我想找到索引A和索引B之间每种组合的长度。因此,在我的示例中,索引A和索引B有三种独特的组合,我想在a中取回3、2、2向量。没有人知道如何在没有for循环的情况下这样做吗?
编辑: 因此,在此示例中,存在三个唯一组合(1 1、1 2和2 1),对于这些组合,存在3个组合1 1、2 of 1 2和2 of 21。因此,我想返回3、2 ,2
答案 0 :(得分:3)
我想这就是你想要的:
library(plyr)
df <- data.frame(index_A = c(1, 1, 1, 1, 1, 2, 2),
index_B = c(1, 1, 1, 2, 2, 1, 1))
count(df, vars = c("index_A", "index_B"))
#> index_A index_B freq
#> 1 1 1 3
#> 2 1 2 2
#> 3 2 1 2
由reprex package(v0.2.1)于2019-03-17创建
我是从here那里得到的。
答案 1 :(得分:3)
在base R
中,我们可以使用table
as.data.frame(table(dat))
答案 2 :(得分:2)
您可以将向量粘贴在一起,然后调用rle
rle(do.call(paste0, dat))$lengths
# [1] 3 2 2
如果您需要将结果作为data.frame
,请
as.data.frame(unclass(rle(do.call(paste0, dat))))
# lengths values
#1 3 11
#2 2 12
#3 2 21
数据
text <- "indexA indexB
1 1
1 1
1 1
1 2
1 2
2 1
2 1"
dat <- read.table(text = text, header = TRUE)
答案 3 :(得分:2)
这有点奇怪:
library(dplyr)
df %>%
mutate(Combined=paste0(`index A`,"_",`index B`)) %>%
group_by(Combined) %>%
summarise(n=n())
# A tibble: 3 x 2
Combined n
<chr> <int>
1 1_1 3
2 1_2 2
3 2_1 2
实际上可以做到:
df %>%
group_by(`index A`,`index B`) %>%
summarise(n=n())
按照@kath的建议添加tidyr
unite
library(tidyr)
df %>%
unite(new_col,`index A`,`index B`,sep="_") %>%
add_count(new_col) %>%
unique()
数据:
df<-read.table(text="index A index B
1 1
1 1
1 1
1 2
1 2
2 1
2 1",header=T,as.is=T,fill=T)
df<-df[,1:2]
names(df)<-c("index A","index B")
答案 4 :(得分:1)
使用dplyr
:
library(dplyr)
count(dat,!!!dat)$n
# [1] 3 2 2