R中新列中的值的计数

时间:2015-08-12 11:40:54

标签: r count sqldf

我有一个数据框,其中包含交易ID和产品名称作为列。我正在尝试创建第3列,它给出了交易ID的计数。最终的数据框应如下所示。

    TID       Product        Orders         
    100       iPhone           2  
    100       Samsung          2  
    101       Lenovo           3  
    101       iPad             3  
    101       Galaxy           3  
    102       iPhone           1  
    103       HTC              1  

我尝试使用长度函数,但这给了我整个列的长度,但不是单个TID。

df$Orders <- length(df$Tid)  

我也尝试使用sqldf函数,如图所示。但是这只给出了不同的TID值。

test <- sqldf("Select TID, count(TID) as Orders, Product from df Group By TID")

3 个答案:

答案 0 :(得分:3)

我们可以使用聚合群组功能之一。使用dplyr,我们按照“TID”进行分组。列,创建新列&#39;订单&#39;使用n()

作为每个组(mutate)内的观察数量
library(dplyr)
df1 %>%
  group_by(TID)%>%
  mutate(Orders=n())
#    TID Product Orders
#1 100  iPhone      2
#2 100 Samsung      2
#3 101  Lenovo      3
#4 101    iPad      3
#5 101  Galaxy      3
#6 102  iPhone      1
#7 103     HTC      1

或者使用data.table,我们会转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df1))。按产品&#39;分组,我们创建一个新列(&#39;订单&#39;)作为每个组中的观察数量(.N)。

library(data.table)
setDT(df1)[, Orders:=.N, by=Product] 

sqldf选项,其中left join原始数据集包含已修改的数据集。

library(sqldf)
sqldf('Select * from df1
       left join(select TID, 
        count(TID) as Orders 
        from df1
        group by TID) 
        using (TID)')
    using (TID)')
#  TID Product Orders
#1 100  iPhone      2
#2 100 Samsung      2
#3 101  Lenovo      3
#4 101    iPad      3
#5 101  Galaxy      3
#6 102  iPhone      1
#7 103     HTC      1

数据

df1 <- structure(list(TID = c(100L, 100L, 101L, 101L, 101L, 102L, 103L
), Product = c("iPhone", "Samsung", "Lenovo", "iPad", "Galaxy", 
"iPhone", "HTC")), .Names = c("TID", "Product"), row.names = c(NA, 
-7L), class = "data.frame")

答案 1 :(得分:1)

基础套餐:

df1$count <- ave(df1$TID, df1$TID, FUN=length)

输出:

  TID Product count
1 100  iPhone     2
2 100 Samsung     2
3 101  Lenovo     3
4 101    iPad     3
5 101  Galaxy     3
6 102  iPhone     1
7 103     HTC     1

答案 2 :(得分:0)

您可以使用data.table包:

library(data.table)
setDT(df)
df[, .(Orders = .N), by = Product]