我有一个数据框,其中包含交易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")
答案 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]