创建一个新列,其中每个元素是另外两列的子集数,无循环

时间:2017-07-25 18:05:11

标签: r dataframe

我有一个类似于下表的数据框,用于跟踪某个月访问商店的人。我想创建一个新列Total_Visits,它是特定ID在某个月内访问商店的次数。在下面的示例中,对于日期6-13和ID 23,Total_Visits在任何行中将为3,其中date == 6-13,ID == 23.

Date    ID   
6-13    23   
6-13    34   
6-13    23   
6-13    23   
7-13    23   

我正在寻找的数据框架

Date    ID    Total_Visits   
6-13    23    3
6-13    34    1
6-13    23    3
6-13    23    3
7-13    23    1

虽然我假设有一些acast函数来确保我不必遍历这个(30,000行),但如果向量化不起作用,我可以使用循环。

2 个答案:

答案 0 :(得分:3)

您可以使用 dplyr 套餐:

library(dplyr)
df %>%  group_by(Date, ID) %>% mutate(Total_Visits = n())

# # A tibble: 5 x 3 
# # Groups:   Date, ID [3] 
#     Date    ID Total_Visits 
#   <fctr> <int>        <int> 
# 1   6-13    23            3 
# 2   6-13    34            1 
# 3   6-13    23            3 
# 4   6-13    23            3 
# 5   7-13    23            1

在输出上使用data.frame使其成为数据帧。

更新

或使用 data.table 套餐:

library(data.table)
setDT(df)[, Total_Visits:=.N, by=c("Date","ID")]

df

#    Date ID Total_Visits 
# 1: 6-13 23            3 
# 2: 6-13 34            1 
# 3: 6-13 23            3 
# 4: 6-13 23            3 
# 5: 7-13 23            1

<强> 数据:

df <- structure(list(Date = structure(c(1L, 1L, 1L, 1L, 2L), .Label = c("6-13", 
      "7-13"), class = "factor"), ID = c(23L, 34L, 23L, 23L, 23L)), .Names = c("Date", 
      "ID"), class = "data.frame", row.names = c(NA, -5L))

答案 1 :(得分:2)

我喜欢使用library(data.table) dat = read.table("clipboard", header = TRUE) setDT(dat) > dat[ , .(visits = .N), by = .(Date, ID)] Date ID visits 1: 6-13 23 3 2: 6-13 34 1 3: 7-13 23 1 进行这些操作。它也是最快的解决方案。

$row = mysqli_fetch_array($result);
相关问题