фильтровать записи в R - PullRequest
       2

фильтровать записи в R

0 голосов
/ 28 августа 2018

У меня фиктивный фрейм данных, как-

account    account_type
  1          A
  1          B
  1          C
  2          A
  2          A
  3          C 
  3          D

Я хочу отфильтровать только те учетные записи, которые имеют несколько account_type, и он вернет вектор всех этих учетных записей. Таким образом, он будет циклически проходить через весь фрейм данных и выдает вектор всех учетных записей, которые в основном относятся к другому типу учетной записи (я имею в виду, что значение account_type больше 1).

итоговый результат - 1,3

Ответы [ 5 ]

0 голосов
/ 29 августа 2018

Для фильтрации записей в R вы можете использовать следующее:

with(unique(dat), unique(account[duplicated(account)]))
# [1] 1 3
0 голосов
/ 28 августа 2018

Базовый раствор R. Мы можем использовать tapply, чтобы применить функцию table для подсчета типа каждого account, извлечь имя таблицы и сохранить имя с более чем одним именем.

r_list <- lapply(tapply(dat$account_type, dat$account, FUN = table), names)
r_vec <- names(r_list[sapply(r_list, length) > 1])
r_vec
# [1] "1" "3"

DATA

dat <- read.table(text = "account    account_type
  1          A
  1          B
  1          C
  2          A
  2          A
  3          C 
  3          D",
                  header = TRUE, stringsAsFactors = FALSE)
0 голосов
/ 28 августа 2018

Вы можете сделать следующее. Удалить дубликаты записей. Подмножество результата table и извлечение names.

d <- d[!duplicated(d),]
names(table(d$account)[table(d$account)>1])

#[1] "1" "3"

Ваши данные

d <- read.table(text="
account    account_type
  1          A
                1          B
                1          C
                2          A
                2          A
                3          C 
                3          D", header=T, stringsAsFactors=F)
0 голосов
/ 28 августа 2018

Вы также можете попробовать использовать библиотеку Plyr:

library(plyr)
test=count(df, c('account')) # Count the frequency based on account type
test[test$freq>1,1]   # Select the account with freq>1

Выход:

[1] 1 3

Другой подход

library(plyr)
test=ddply(df, .(account), nrow) # Calculate the occurence of account
test[test$V1>1,1]  # Select the account with occurence>1

Выход:

[1] 1 3
0 голосов
/ 28 августа 2018

Использование data.table:

library(data.table)
setDT(df)
df[, .(nacc = uniqueN(account_type)), by = account][nacc > 1, toString(account)]
## [1] "1, 3"

Делать что-то подобное в dplyr:

library(dplyr)
df %>%
  group_by(account) %>%
  summarise(nacc = n_distinct(account_type)) %>%
  filter(nacc > 1) %>%
  summarise(toString(account)) %>% 
  pull()
## [1] "1, 3"

Где:

df <- data.frame(
  account = c(1L, 1L, 1L, 2L, 3L, 3L), 
  account_type = c("A", "B", "C", "A", "C", "D")
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...