我有一个特定的问题我尝试使用R在数据框架内解决。以下是列和几行示例数据:
我想编写一个函数,找到有多个FIPS和多个PROMO的ZIP。换句话说,ZIPS与不同的PROMO交叉FIPS。我不需要担心COUNTY,FACTOR_X和FACTOR_Y,但我确实需要保留它们。
有三种可能的PROMO级别(LOW,ZERO,VARIABLE)。如果ZIP存在于多个FIPS中且PROMO在子集内不明显,则STATUS为FAIL。但是,如果ZIP存在于多个FIPS中且PROMO在子集中不同(相同),则STATUS为PASS。
以下是一些示例输出
ZIP,ST_COUNTY,FIPS,FACTOR_X,FACTOR_Y,PROMO,STATUS
8520,NJ MERCER,34021,XXX,YYY,VARIABLE,FAIL8520,NJ MIDDLESEX,34023,XXX,YYY,ZERO,FAIL
8525,NJ XUNTERDON,34019,XXX,YYY,LOW,FAIL 8525,NJ MERCER,34021,XXX,YYY,VARIABLE,FAIL8540,NJ MERCER,34021,XXX,YYY,VARIABLE,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,VARIABLE,FAIL
8558,NJ SOMERSET,34035,XXX,YYY,ZERO,FAIL
23117,VA GOOCXLAND,51075,XXX,YYY,ZERO,FAIL
23117,VA LOUISA,51109,XXX,YYY,LOW,FAIL
23117,VA SPOTSYLVANIA,51177,XXX,YYY,LOW,FAIL
23117,VA SPOTSYLVANIA,51177,XXX,YYY,ZERO,FAIL
78015,TX BEXAR,48029,XXX,YYY,ZERO,FAIL
78015,TX BEXAR,48029,XXX,YYY,ZERO,FAIL
78015,TX COMAL,48091,XXX,YYY,LOW,FAIL
78015,TX COMAL,48091,XXX,YYY,ZERO,FAIL
78015,TX KENDALL,48259,XXX,YYY,LOW,FAIL
78015,TX KENDALL,48259,XXX,YYY,ZERO,FAIL
1906年,MA ESSEX,25009,XXX,YYY,LOW,PASS
1906,MA MIDDLESEX,25017,XXX,YYY,LOW,PASS
1906年,MA SUFFOLK,25025,XXX,YYY,LOW,PASS16127,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 VENANGO,42121,XXX,YYY,ZERO,PASS
对于输出,我想分成两个文件,原始列加上新的STATUS列。第一个文件是ZIP_PASS,所有STATUS == PASS,第二个文件是ZIP_FAIL,所有STATUS == FAIL
=======
答案 0 :(得分:0)
这会有用吗?
space
数据强>
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