根据R中的条件计算两列的频率

时间:2018-04-06 08:24:47

标签: r count conditional-statements multiple-columns frequency

你好我在数据帧中有两列。材料编号和供应商编号。我想知道从两个或更多供应商订购的材料编号?

关注数据框

C:\Windows\System32\inetsrv\Config\applicationHost.config

我希望以这种格式获得结果

OrderNo. Supplier Materialno
  1          LF       101
  2          LF       101
  3          LF       101
  4          DD       101
  5          DD       102
  6          DF       103
  7          DF       104
  8          DD       103
  9          DD       104
 10          AA       105
 11          AB       105
 12          AC       106 

3 个答案:

答案 0 :(得分:4)

使用dplyr

library(dplyr)
df %>%
  group_by(Materialno) %>%
  mutate(Count = n_distinct(Supplier)) %>%
  ungroup()

<小时/> 产生

# A tibble: 12 x 4
   OrderNo. Supplier Materialno Count
      <int> <chr>         <int> <int>
 1        1 LF              101     2
 2        2 LF              101     2
 3        3 LF              101     2
 4        4 DD              101     2
 5        5 DD              102     1
 6        6 DF              103     2
 7        7 DF              104     2
 8        8 DD              103     2
 9        9 DD              104     2
10       10 AA              105     2
11       11 AB              105     2
12       12 AC              106     1

请注意,您的输入数据框有除输出数据帧之外的其他行,因此与您想要的输出之间存在差异。

答案 1 :(得分:2)

使用基础R它是一个单行。

df$Count <- ave(as.integer(df$Supplier), df$Materialno, FUN = function(x) length(unique(x)))

df
#   OrderNo. Supplier Materialno Count
#1         1       LF        101     2
#2         2       LF        101     2
#3         3       LF        101     2
#4         4       DD        101     2
#5         5       DD        102     1
#6         6       DF        103     2
#7         7       DF        104     2
#8         8       DD        103     2
#9         9       DD        104     2
#10       10       AA        105     2
#11       11       AB        105     2
#12       12       AC        106     1

答案 2 :(得分:0)

基地R:

merge(df, 
      do.call(rbind, by(df, df$Materialno, function(x) {
        c(Materialno = x$Materialno[1], Count = length(unique(x$Supplier)))))
      },
      by = "Materialno")

   Materialno OrderNo. Supplier Count
1         101        1       LF     2
2         101        2       LF     2
3         101        3       LF     2
4         101        4       DD     2
5         102        5       DD     1
6         103        6       DF     2
7         103        8       DD     2
8         104        7       DF     2
9         104        9       DD     2
10        105       10       AA     2
11        105       11       AB     2
12        106       12       AC     1