Как найти индексы изменения на основе двух векторов r - PullRequest
1 голос
/ 17 марта 2019

У меня есть два вектора, которые содержат индексы, которые выглядят как

index A  index B
   1        1
   1        1
   1        1
   1        2
   1        2
   2        1
   2        1

Теперь я хочу найти длину каждой комбинации между индексом A и индексом B. Итак, в моем примере есть три уникальные комбинациидля индекса A и индекса B, и я хочу вернуться 3, 2, 2 в векторе.Кто-нибудь знает, как это без цикла for?

РЕДАКТИРОВАТЬ: Итак, в этом примере есть три уникальные комбинации (1 1, 1 2 и 2 1), для которых есть 3 комбинации 1 1,2 из 1 2 и 2 из 2 1. Поэтому я хочу вернуть 3, 2, 2

Ответы [ 5 ]

3 голосов
/ 17 марта 2019

В base R мы можем использовать table

as.data.frame(table(dat))
3 голосов
/ 17 марта 2019

Я думаю, что это то, что вы хотите:

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

Создано в 2019-03-17 пакетом Представить (v0.2.1)

Я получил это от здесь .

2 голосов
/ 17 марта 2019

Это как-то хакерски:

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())

Добавление tidyr unite в соответствии с предложением @ kath

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")
2 голосов
/ 17 марта 2019

Вы можете вставить векторы вместе и вызвать 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

data

text <- "indexA  indexB
   1        1
   1        1
   1        1
   1        2
   1        2
   2        1
   2        1"

dat <- read.table(text = text, header = TRUE)
1 голос
/ 18 марта 2019

Использование dplyr:

library(dplyr)
count(dat,!!!dat)$n
# [1] 3 2 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...