2017-09-08 61 views
0

我有我想要使用R.这里一个数据帧中,以解决特定问题是列和样本数据的几行找到特定的条件:如何写R功能在数据帧

我想要编写一个功能,在有多个FIPS和多个PROMO的情况下查找ZIP。换句话说,用不同的PROMO交叉FIPS的ZIPS。我不需要担心COUNTY,FACTOR_X和FACTOR_Y,但我确实需要保留它们。

有三种可能的PROMO级别(LOW,ZERO,VARIABLE)。如果一个ZIP存在于多个FIPS中,并且PROMO在该子集内不明显,则状态为FAIL。但是,如果一个ZIP存在于多个FIPS中,并且PROMO在该子集内不同(相同),则状态为PASS。

下面是一些示例输出

ZIP,ST_COUNTY,FIPS,FACTOR_X,FACTOR_Y,促销,STATUS

8520,NJ MERCER,34021,XXX,YYY,变量,FAIL

8520 NJ MIDDLESEX,34023,XXX,YYY,ZERO,FAIL

8525,NJ XUNTERDON,34019,XXX,YYY,LOW,FAIL

8525,NJ MERCER,34021,XXX,YYY,变量,FAIL

8540,NJ MERCER,34021,XXX,YYY,变量,FAIL

8540,NJ MIDDLESEX,34023,XXX,YYY,ZERO,FAIL

8540,NJ SOMERSET,34035,XXX,YYY ,ZERO,FAIL

8558,NJ XUNTERDON,34019,XXX,YYY,LOW,FAIL

8558,NJ MERCER,34021,XXX,YYY,变量,FAIL

8558,NJ SOMERSET,34035 ,XXX,YYY,ZERO,FAIL

23117,VA GOOCXLAND,51075,XXX,YYY,ZERO,FAIL

23117,弗吉尼亚州路易莎51109,XXX,YYY,LOW,FAIL

23117,VA SPOTSYLVANIA,51177,XXX,YYY, LOW,FAIL

23117,VA SPOTSYLVANIA,51177,XXX,YYY,ZERO,FAIL

78015,德克萨斯州贝克萨尔,48029,XXX,YYY,ZERO,FAIL

78015,德克萨斯州贝克萨尔,48029, XXX,YYY,ZERO,FAIL

78015,TX科马尔,48091,XXX,YYY,LOW,FAIL

78015,TX科马尔,48091,XXX,YYY,ZERO,FAIL

78015,德克萨斯州肯德尔48259,XXX,YYY, LOW,FAIL

78015,德克萨斯州肯德尔48259,XXX,YYY,ZERO,FAIL

1906年,MA ESSEX,25009,XXX,YYY,LOW,PASS

1906年,MA MIDDLESEX,25017, XXX,YYY,LOW,PASS

1906年,马萨诸塞州萨福克,25025,XXX,YYY,LOW,PASS

16127,PA BUTLER,42019,XXX,YYY,ZERO,PASS

16127,PA LAWRENCE,42073,XXX,YYY,ZERO ,PASS

16127,PA MERCER,42085,XXX,YYY,ZERO,PASS

16127,PA韦南戈,42121,XXX,YYY,ZERO,PASS

对于输出,我想分裂分成两个文件,包括原始列和新的STATUS列。第一个文件是ZIP_PASS所有STATUS == PASS和第二个文件是ZIP_FAIL所有STATUS == FAIL

=======

+0

你应该明确地提供与你的榜样预期输出。有关详细信息:https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/28481250#28481250 – Frank

+0

感谢弗兰克的建议,按要求编辑。 – Tony

+1

如果您将期望的STATUS列添加到样本数据中,它会有所帮助。前四行是否会失败(因为它们都是PROMO = LOW)并且最后四行是否通过? – Gabe

回答

0

将这项工作?

library(dplyr) 
df2 <- df1 %>% group_by(ZIP) %>% 
    mutate(STATUS=c("PASS","FAIL")[(n_distinct(PROMO)==n())+1]) %>% 
    ungroup 

df_pass <- filter(df2,STATUS=="PASS") 
df_fail <- filter(df2,STATUS=="FAIL") 

# # A tibble: 8 x 7 
# # Groups: ZIP [4] 
# ZIP  ST_COUNTY FIPS FACTOR_X FACTOR_Y PROMO STATUS 
# <int>   <chr> <int> <chr> <chr> <chr> <chr> 
# 1 1431 MA MIDDLESEX 25017  XXX  YYY LOW PASS 
# 2 1431 MA WORCESTER 25027  XXX  YYY LOW PASS 
# 3 1434 MA MIDDLESEX 25017  XXX  YYY LOW PASS 
# 4 1434 MA WORCESTER 25027  XXX  YYY LOW PASS 
# 5 4009 ME CUMBERLAND 23005  XXX  YYY ZERO FAIL 
# 6 4009  ME OXFORD 23017  XXX  YYY LOW FAIL 
# 7 4029 ME CUMBERLAND 23005  XXX  YYY ZERO FAIL 
# 8 4029  ME OXFORD 23017  XXX  YYY LOW FAIL 

数据

df1 <- read.table(text="ZIP,ST_COUNTY,FIPS,FACTOR_X,FACTOR_Y,PROMO 
01431,MA MIDDLESEX,25017,XXX,YYY,LOW 
01431,MA WORCESTER,25027,XXX,YYY,LOW 
01434,MA MIDDLESEX,25017,XXX,YYY,LOW 
01434,MA WORCESTER,25027,XXX,YYY,LOW 
04009,ME CUMBERLAND,23005,XXX,YYY,ZERO 
04009,ME OXFORD,23017,XXX,YYY,LOW 
04029,ME CUMBERLAND,23005,XXX,YYY,ZERO 
04029,ME OXFORD,23017,XXX,YYY,LOW",sep=",",header=T,stringsAsFactors=F) 
+0

这太棒了!要创建两个表并将其分解可能只是STATUS上的一个过滤器,对吗? – Tony

+0

是的,这些表是'df_pass'和'df_fail' :) –

+0

我在第一个查询的末尾添加了一个'ungroup'语句以确保安全 –