确定一列数据帧中的值是否在另一列R中具有多于一个对应值

时间:2018-03-09 14:02:28

标签: r dataframe

尝试对示例客户(EC)的数据框进行一些数据分析,并寻求确定从多个仓库(DC)运送到哪些客户。

最终州的目标是将EC的名称与DC进行比较,并确定是否有EC将多个DC映射到它们。

If(EC > 1 DC) {
EC = num(DC)
}

显然上面的内容并没有回到我的意图,我甚至不确定这需要一个循环。在此先感谢您的帮助。

编辑:

# A tibble: 11 x 10
dc_id ec_id  DC                    DC_ZIP EC                                   
EC_ZIP `Zip-Zip`   Miles `Revised Rate` cost_per_mile
<chr> <chr>  <chr>                 <chr>  <chr>                                
<chr>  <chr>       <dbl>          <dbl>         <dbl>
1 DC13  M2980  ATLANTA_RDC_WAREHOUSE 30168  SAFEWAY_AUBURN_GROC_DCAuburn         
 98047  30168-98047  2587           4457          1.72
2 DC13  M29831 ATLANTA_RDC_WAREHOUSE 30168  FRED_MEYER_PV_DGRPUYALLUP            
98371  30168-98371  2592           4465          1.72
3 DC13  M2983  ATLANTA_RDC_WAREHOUSE 30168  COSTCO_WASH_WHOLESALE_AUSUMNER       
98390  30168-98390  2589           4461          1.72
4 DC13  M2983  ATLANTA_RDC_WAREHOUSE 30168  COSTCO_WASH_WHOLESALESUMNER          
98390  30168-98390  2589           4461          1.72
5 DC13  M1989  ATLANTA_RDC_WAREHOUSE 30168  WALMART_DC_7021GRANDVIEW             
98930  30168-98930  2447           4487          1.83
6 DC16  M2015  Orlando, FL           32803  
MCKESSON_MED_SURG_NORTHBNORTHBOROUGH 01532  32803-01532  1244           2254          
1.81
7 DC16  M20151 Orlando, FL           32803  CLUB_800_BJS_DISTRIBUTIOUXBRIDGE     
01569  32803-01569  1239           2246          1.81
8 DC16  M20181 Orlando, FL           32803  GERIATRIC_MEDICAL_SURGERWOBURN       
01801  32803-01801  1276           2305          1.81
9 DC16  M2018  Orlando, FL           32803  DEMOULAS_SUPER_MARKETSTEWKSBURY      
01876  32803-01876  1280           2312          1.81
10 DC16  M2020  Orlando, FL           32803  
MEDICAL_SPECIALTIES_DISTSTOUGHTON    02072  32803-02072  1269           2294          
1.81
11 DC16  M2028  Orlando, FL           32803  MARK_STEVENS_W101WOONSOCKET          
02895  32803-02895  1243           2209          1.78

编辑2:

DC <- as.data.frame(dc_ec_cost$DC)
EC <- as.data.frame(dc_ec_cost$EC)
EC$occurences_in_dc <- rowSums(sapply(dc, function(col) dc_ec$EC %in% col))

错误是&#34; x必须是2D&#34;

的数组

3 个答案:

答案 0 :(得分:0)

dc <- data.frame(x = sample(1:20, 10), y = sample(1:20, 10), z = sample(1:20, 10))
ec <- data.frame(w = sample(1:20, 10))
ec$occurences_in_dc <- rowSums(sapply(dc, function(col) ec$w %in% col))

这里我们创建一个数据帧dc,有3列x,y和z 然后我们用一列w。

创建一个数据框ec

然后我们在ec,occurences_in_dc中创建一个新列,表示每个ec $ w在dc中的列中出现的次数

与非数字数据相同:

dc <- data.frame(x = sample(letters, 10), y = sample(letters, 10), z = sample(letters, 10))
ec <- data.frame(w = sample(letters, 10))
ec$occurences_in_dc <- rowSums(sapply(dc, function(col) ec$w %in% col))

如果您需要比文字字符串完全匹配更多的灵活性,您可以使用不同的函数grepl与正则表达式或固定匹配。

答案 1 :(得分:0)

也许是这些方面的东西?

library(tidyverse);
as.data.frame(lst) %>%
    group_by(EC) %>%
    mutate(nDC = n()) %>%
    filter(nDC == 1);
## A tibble: 10 x 8
## Groups:   EC [10]
#   dc_id ec_id  DC                     DC_ZIP EC           EC_ZIP Zip.Zip   nDC
#   <fct> <fct>  <fct>                  <fct>  <fct>        <fct>  <fct>   <int>
# 1 DC2   M2028  ALTA_VISTA_REGIONAL_DC 24517  MARK_STEVEN… 02896  24517-…     1
# 2 DC2   M2028  ALTA_VISTA_REGIONAL_DC 24517  MARK_STEVEN… 02895  24517-…     1
# 3 DC2   M2907  ALTA_VISTA_REGIONAL_DC 24517  RALPHS_GROC… 92507  24517-…     1
# 4 DC2   M2153  ALTA_VISTA_REGIONAL_DC 24517  OK_GROCERYP… 15205  24517-…     1
# 5 DC2   M2379  ALTA_VISTA_REGIONAL_DC 24517  CVS_DISTRIB… 37774  24517-…     1
# 6 DC2   M22740 ALTA_VISTA_REGIONAL_DC 24517  HARRIS_TEET… 28079  24517-…     1
# 7 DC2   M2907  ALTA_VISTA_REGIONAL_DC 24517  RALPHS_PARA… 90723  24517-…     1
# 8 DC2   M2153  ALTA_VISTA_REGIONAL_DC 24517  HBC_SERVICE… 15301  24517-…     1
# 9 DC2   M2379  ALTA_VISTA_REGIONAL_DC 24517  CVS_DISTRIB… 37922  24517-…     1
#10 DC2   M22740 ALTA_VISTA_REGIONAL_DC 24517  HARRIS_TEET… 27410  24517-…     1

说明:将list转为data.framegroup_byEC,将每个EC的条目数存储在nDC中,并{ {1}} filter行。

样本数据

nDC == 1

答案 2 :(得分:0)

怎么样

library(dplyr)
df %>% group_by(EC, DC) %>%
  count() %>% 
  filter(n > 1)

以下是n>1报告计数的测试。

set.seed(2)
df2 <- data.frame(
  EC = sample(LETTERS[1:8], 20, replace = TRUE),
  DC = sample(letters[1:8], 20, replace = TRUE)
)

df2 %>% group_by(EC, DC) %>%
  count() %>% 
  filter(n > 1)

# # A tibble: 3 x 3
# # Groups:   EC, DC [3]
#   EC    DC        n
#   <chr> <chr> <int>
# 1 A     h         2
# 2 C     b         2
# 3 D     g         3