在R中,仅保留至少3年的值,每年至少10次

时间:2017-06-07 21:56:02

标签: python r conditional

请参阅下面我的数据集的一般示例。我只想保留至少3年出现的ID计数数据,每年至少出现10次。所以,在这里,我只想要来自ID“a”的数据,并且我想要删除ID为“b”和“c”的数据。

我对r,python和excel有一些基本/一般知识。使用这三种语言中的任何一种语言都可以做到这一点。我想r会更受欢迎。谢谢。

node-debug sls offline 

3 个答案:

答案 0 :(得分:2)

在R中你可以使用

GoodIDs = names(which(rowSums(table(df$ID, df$year) >= 10) >=3))
df[df$ID %in% GoodIDs,]

血腥细节

只是制作一张每年-id组合发生次数的表格有很多帮助。

table(df$ID, df$year)
    2001 2002 2003
  a   11   11   12
  b    4    4    4
  c    2    4    3

现在我们看到答案(只需要id = a),但我们希望通过这个来获得完整的答案。下一步,测试表中的哪些条目至少为10.

table(df$ID, df$year) >= 10
     2001  2002  2003
  a  TRUE  TRUE  TRUE
  b FALSE FALSE FALSE
  c FALSE FALSE FALSE

现在我们要计算每个id多少年。使用TRUE将被视为1和FALSE这一事实将被视为0,我们可以在行中添加。

rowSums(table(df$ID, df$year) >= 10)
a b c 
3 0 0 

现在我们要测试其中哪一个至少为3

which(rowSums(table(df$ID, df$year) >= 10) >=3)
a 
1

现在获取选择的ID

names(which(rowSums(table(df$ID, df$year) >= 10) >=3))
[1] "a"

我们将其存储在GoodIDs中,然后使用所选ID提取所有行。

df[df$ID %in% GoodIDs,]
<output omitted>

答案 1 :(得分:0)

Python Pandas解决方案:

import pandas as pd

将CSV文件读入DataFrame:

df = pd.read_table('foo.csv', sep='\s+')

按ID和年份分组,仅选择总数至少为10的年份和ID:

df1 = df.groupby(['ID','year']).sum()
df2 = df1[df1 >= 10].dropna()

消除所有少于3年的变量:

df3 = df2.reset_index().groupby('ID').count()['count']
df3[df3 >= 3].index.values

结果:

#array(['a'], dtype=object)

答案 2 :(得分:0)

已经使用base Rthe dplyr package in RPython Panda提出了解决方案。为了完整起见,我想建议一个使用data.table包的R解决方案,该解决方案已经获得了大数据快速聚合,快速有序连接等声誉。

OP希望保持显示至少3年的ID的计数数据,每年至少出现10次

因此,有必要确定应保留其数据的ID,并相应地过滤数据集。为了识别符合要求的ID,重要的是首先测试哪些年满足每个ID的10个出现条件,然后计算每个ID的年数。

使用data.table,这可以合并为一行:

library(data.table)
setDT(DF)[DF[, .N, .(ID, year)][N >= 10L, .N, ID][N >= 3L, .(ID)], on = "ID"]

解释

  1. setDT(DF)将data.frame强制转换为类data.table
  2. DF[, .N, .(ID, year)]计算按ID和年份分组的出场次数。
  3. 下一个操作[N >= 10L, .N, ID]链接,即它将上一步的结果作为输入。它计算满足10个条件的每个ID的年数。
  4. [N >= 3L, .(ID)]检查3年有条件并返回data.table,其中只包含一列包含所选ID的内容。
  5. 完整数据集的最终过滤操作实现为具有所选ID的右连接。它仅返回ID与所选ID之一匹配的完整数据集的那些行。在联接操作setDT(DF)[DF[...], on = "ID"]中,on = "ID"参数告诉data.table在哪个列中查找匹配项。
  6. 数据

    我在2003年为ID“b”添加了几行数据,以涵盖一个ID符合10个条件但有条件但只有一年的情况。

    DF <- structure(list(ID = c("a", "b", "a", "a", "a", "a", "a", "a", 
    "a", "b", "b", "a", "b", "c", "a", "a", "c", "c", "a", "b", "c", 
    "a", "a", "a", "a", "a", "a", "b", "b", "a", "b", "c", "a", "a", 
    "a", "c", "a", "a", "a", "a", "c", "a", "a", "b", "a", "a", "a", 
    "a", "a", "a", "c", "b", "b", "b", "b", "b", "b", "b", "b", "b", 
    "c"), year = c(2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 
    2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 
    2001L, 2002L, 2002L, 2002L, 2002L, 2002L, 2002L, 2002L, 2002L, 
    2002L, 2002L, 2002L, 2002L, 2002L, 2002L, 2002L, 2002L, 2002L, 
    2002L, 2002L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 
    2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 
    2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L
    ), count = c(2L, 3L, 2L, 1L, 4L, 0L, 1L, 3L, 2L, 3L, 4L, 5L, 
    2L, 3L, 5L, 1L, 1L, 2L, 1L, 2L, 3L, 2L, 1L, 3L, 4L, 3L, 2L, 4L, 
    2L, 1L, 1L, 2L, 3L, 4L, 5L, 2L, 2L, 1L, 2L, 4L, 3L, 2L, 1L, 3L, 
    5L, 3L, 2L, 1L, 3L, 2L, 2L, 2L, 1L, 4L, 2L, 1L, 4L, 2L, 1L, 4L, 
    3L)), .Names = c("ID", "year", "count"), row.names = c(NA, -61L
    ), class = "data.frame", index = structure(integer(0), "`__ID`" = c(1L, 
    3L, 4L, 5L, 6L, 7L, 8L, 9L, 12L, 15L, 16L, 19L, 22L, 23L, 24L, 
    25L, 26L, 27L, 30L, 33L, 34L, 35L, 37L, 38L, 39L, 40L, 42L, 43L, 
    45L, 46L, 47L, 48L, 49L, 50L, 2L, 10L, 11L, 13L, 20L, 28L, 29L, 
    31L, 44L, 52L, 53L, 54L, 55L, 56L, 57L, 58L, 59L, 60L, 14L, 17L, 
    18L, 21L, 32L, 36L, 41L, 51L, 61L)))