Python 在R中,仅保留出现至少3年的值,每年至少10次
请参阅下面我的数据集的一般示例。我只想保留ID中的计数数据,这些数据至少出现3年,每年至少出现10次。所以,这里,我只需要ID为“a”的数据,我想删除ID为“b”和“c”的数据 我对r、python和excel有一些基本/一般的知识。使用这三种语言中的任何一种都可以做到这一点。我想我更喜欢r。多谢各位Python 在R中,仅保留出现至少3年的值,每年至少10次,python,r,conditional,Python,R,Conditional,请参阅下面我的数据集的一般示例。我只想保留ID中的计数数据,这些数据至少出现3年,每年至少出现10次。所以,这里,我只需要ID为“a”的数据,我想删除ID为“b”和“c”的数据 我对r、python和excel有一些基本/一般的知识。使用这三种语言中的任何一种都可以做到这一点。我想我更喜欢r。多谢各位 ID year count a 2001 2 b 2001 3 a 2001 2 a 2001 1 a 2001 4 a 2001
ID year count
a 2001 2
b 2001 3
a 2001 2
a 2001 1
a 2001 4
a 2001 0
a 2001 1
a 2001 3
a 2001 2
b 2001 3
b 2001 4
a 2001 5
b 2001 2
c 2001 3
a 2001 5
a 2001 1
c 2001 1
c 2002 2
a 2002 1
b 2002 2
c 2002 3
a 2002 2
a 2002 1
a 2002 3
a 2002 4
a 2002 3
a 2002 2
b 2002 4
b 2002 2
a 2002 1
b 2002 1
c 2002 2
a 2002 3
a 2002 4
a 2002 5
c 2002 2
a 2003 2
a 2003 1
a 2003 2
a 2003 4
c 2003 3
a 2003 2
a 2003 1
b 2003 3
a 2003 5
a 2003 3
a 2003 2
a 2003 1
a 2003 3
a 2003 2
c 2003 2
b 2003 2
b 2003 1
b 2003 4
c 2003 3
在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。使用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"
我们将其存储在GoodID中,然后提取具有所选ID的所有行
df[df$ID %in% GoodIDs,]
<output omitted>
df[df$ID%在%goodid中,]
Python解决方案:
import pandas as pd
将CSV文件读入数据帧:
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)
已经提出了使用和的解决方案。为了完整性起见,我建议使用
data.table
包的R解决方案,该包以快速聚合大数据、快速有序联接等著称
OP希望保留ID的计数数据,这些数据至少出现3年,每年至少出现10次
因此,有必要确定应保留其数据的ID,并相应地过滤数据集。为了确定符合要求的ID,首先测试每个ID满足10个条件的年份,然后计算每个ID的年数是很重要的
使用数据。表
可以在一行中组合:
library(data.table)
setDT(DF)[DF[, .N, .(ID, year)][N >= 10L, .N, ID][N >= 3L, .(ID)], on = "ID"]
解释
data.table
DF[,.N,.(ID,year)]
统计按ID和year分组的外观数量[N>=10L,.N,ID]
是链接的,即它将上一步的结果作为输入。它计算满足10个条件的每个ID的年数[N>=3L,.(ID)]
检查3年条件并返回一个数据。表
仅包含一列所选IDsetDT(DF)[DF[…],on=“ID”]
中,参数告诉on=“ID”
要在哪个列中查找匹配项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)))
DF那么到目前为止你有什么?嘿@hminutu让我们看看你已经完成了什么。是否正确count
与决定无关?仅仅一个身份证在三年中每年至少出现10次?老实说,我还没有什么。我想应该有if语句之类的。3年条件的第一个if语句,然后是10年条件库(dplyr)的另一个if语句;df%>%group\u by(ID)%%>%filter(n\u distinct(year)>=3)%%>%group\u by(ID,year)%%>%filter(n()>=10)
这看起来不错。。。!你能解释一下它是怎么工作的吗。。?或者其他人可以吗?它似乎起作用了,但我真的很想知道它是如何起作用的。非常感谢。好的,我正在努力解决这个问题,我想我看到了它的工作原理。我在我原来的帖子里忘了一个关键词。。。我希望是连续三年。这能做到吗。。?看起来不是,但我可能错了。有什么我可以补充,使它连续?这不需要几年连续。这看起来很好,我真的很感谢你的努力,以彻底解释这一点。。。。但是,到底什么是大熊猫?谢谢。熊猫是一个处理数据集的图书馆。它在数据处理中被大量使用