如何编写R函数来查找数据帧中的特定条件

时间:2017-09-08 14:10:01

标签: r

我有一个特定的问题我尝试使用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,FAIL

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

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

8525,NJ MERCER,34021,XXX,YYY,VARIABLE,FAIL

8540,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,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 VENANGO,42121,XXX,YYY,ZERO,PASS

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

=======

1 个答案:

答案 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