过滤R中的记录

时间:2018-08-28 12:26:17

标签: r dplyr

我有一个虚拟数据框,例如-

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 :(得分:0)

使用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")
)

答案 1 :(得分:0)

您可以执行以下操作。删除重复的条目。子集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)

答案 2 :(得分:0)

您也可以尝试使用 =SPLIT( ARRAY_CONSTRAIN( QUERY( IMPORTRANGE("13evadbMLzvQVSGbYssn_0deFdcmb5l3sqpeFgcNTjOY"; "'Sheet1'!AG1:AG1000"); "select Col1 where Col1 ='"& FILTER( IMPORTRANGE("13evadbMLzvQVSGbYssn_0deFdcmb5l3sqpeFgcNTjOY"; "'Sheet1'!AG1:AG1000"); ISNUMBER( SEARCH("♤"; IMPORTRANGE("13evadbMLzvQVSGbYssn_0deFdcmb5l3sqpeFgcNTjOY"; "'Sheet1'!AG1:AG1000")) )) &"'"); 1; 1); "♤"; 1; 0) 库:

 =SPLIT(
        ARRAY_CONSTRAIN(
                        QUERY(


        IMPORTRANGE("13evadbMLzvQVSGbYssn_0deFdcmb5l3sqpeFgcNTjOY"; "'Sheet1'!AG1:AG1000");

        "select Col1 where Col1 ='"&
        FILTER(

        IMPORTRANGE("13evadbMLzvQVSGbYssn_0deFdcmb5l3sqpeFgcNTjOY"; "'Sheet1'!AG1:AG1000");

                   ISNUMBER(
                            SEARCH("avg LMT";

        IMPORTRANGE("13evadbMLzvQVSGbYssn_0deFdcmb5l3sqpeFgcNTjOY"; "'Sheet1'!AG1:AG1000"))

                   ))
                                    &"'"); 
                        1; 1); 
       "♤"; 1; 0)

输出:

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

答案 3 :(得分:0)

基本的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"

数据

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)

答案 4 :(得分:0)

您可以使用以下内容过滤R中的记录:

with(unique(dat), unique(account[duplicated(account)]))
# [1] 1 3