R中具有多个subset()函数的循环:有没有更优雅/更快的方法?

问题描述 投票:0回答:1

我正在尝试在相当大的数据帧(大小为50,000rx 150c)上计算一些历史平均值,为此,我首先需要根据两个条件对数据进行子集化,然后对其中一个子集列应用一些算术函数。然后,将结果作为特定时间段内计数/平均值/加权平均值的新列写入另一个数据帧。由于数据集的大小(以及我的编码技能的局限性),这花费了很长时间,而我的问题是,是否有更好的方法来解决R中的此类问题?

这是一个简单的示例,用来说明我正在尝试做的事情:

library(lubridate)

###  Create dataframe Df

date <- c("01/01/2020", "02/01/2020", "02/01/2020","02/01/2020", "03/01/2020", 
          "03/01/2020", "03/01/2020", "03/01/2020", "04/01/2020", "04/01/2020")
date <- dmy(date)
name <- c("john", "paul", "john", "peter", "peter", 
          "john", "andrew", "john", "peter", "peter")
visits <- c(1, 3, 2, 1, 3, 
            4, 6, 1 ,1, 9)
Df <- data.frame(date, name, visits)
Df


###  Create dataframe Df1

date1 <- c("01/01/2020", "02/01/2020", "03/01/2020", "04/01/2020")
date1 <- dmy(date1)
name1 <- c("john", "paul", "andrew", "peter")
totvisits <- c(0, 0, 0, 0)
Df1 <- data.frame(date1, name1, totvisits)
Df1

Df$name <- as.character(Df$name)
Df1$name1 <- as.character(Df1$name1)

在此示例中,我想(根据Df1中的每个行name1 / date1对)根据日期/名称划分子集Df,并返回每个'name1'在每个'date1'值之前进行的访问次数,即,将'日期

### loop 
for (i in 1:dim(Df1)[1]) {
  Df1[i, 3] <- sum(subset(Df, Df$name == Df1$name1[i] & Df$date <= Df1$date1[i])[,3])
}
Df1

### apply()
f <- function(x, y) {
  sum(subset(Df, (Df$name == x) & (Df$date <= y))[,3])
  }
Df1[, 3] <- mapply(f, x = Df1$name1, y = Df1$date1)
Df1

任何想法或有关替代方法的指点将不胜感激。

r loops subset mapply
1个回答
0
投票

仍然不是100%知道我是否知道您想做什么,但这是dplyr的获取方式:

© www.soinside.com 2019 - 2024. All rights reserved.