For或Repeat Loop根据字符串值而不是数字序列进行过滤

基于数据帧cur中的唯一样式编号,我无法使用For循环依次过滤较大的交易数据集并对其进行操作。

我有一个唯一字符串值(cur)的单列数据帧,我需要根据字符串的唯一数据帧中的每个值依次过滤更大的数据集。

我尝试使用如下所示的for循环:


cur <- data.frame(
  `Style-Brand` = c("aa","bb","cc","dd","ee","ff"))
dem2 <- data.frame(
  `Brand` = c("a","b","c","d","e","f"),`Week` = c("8-20-2017","8-20-2017","8-20-2017"),`Units Sold` = c("1","2","1","2"),`Style-Brand` = c("aa","ff"))

for (i in cur) {

  demx <- dem2 %>% filter(`Style-Brand` == i)

在执行顺序过滤之后,我仅对在此处选择的数据子集执行一堆其他操作,然后将输出值存储到数据帧中。我需要执行过滤器,遍历下面的代码块,然后循环回到列表中的下一个字符串。

据我了解的越多,For循环仅适用于行的索引?而且您还需要提前知道行数吗?

任何人都可以提出另一种我可以做到这一点的方法吗?

谢谢!

qq9931 回答:For或Repeat Loop根据字符串值而不是数字序列进行过滤

这里实际上不需要for循环。您可以使用dplyr::group_splitsplit根据一列中的值将数据帧分为数据帧列表:

library(dplyr)
group_split(dem2,Style.Brand) # dpylyr option
split(dem2,dem2$Style.Brand)  # base R option

#### OUTPUT ####
$aa
  Brand      Week Units.Sold Style.Brand
1     a 8-20-2017          1          aa

$bb
  Brand      Week Units.Sold Style.Brand
2     b 8-20-2017          2          bb

$cc
  Brand      Week Units.Sold Style.Brand
3     c 8-20-2017          1          cc

$dd
  Brand      Week Units.Sold Style.Brand
4     d 8-20-2017          1          dd

$ee
  Brand      Week Units.Sold Style.Brand
5     e 8-20-2017          1          ee

$ff
  Brand      Week Units.Sold Style.Brand
6     f 8-20-2017          2          ff
,

通常,您应该首先使用vector为列表分配足够的空间。在这里这并不是真正的问题,但是如果您拥有更多的数据,则不断增长的列表确实会降低R的速度。然后,您可以遍历cur$Style.Brand的整数位置,将filter的输出分配给i的第df_list个元素:

df_list <- vector(mode = "list",length = nrow(cur))

for (i in seq_along(cur$Style.Brand)) {
    df_list[[i]] <- dplyr::filter(dem2,Style.Brand == cur$Style.Brand[i])
}

或者,您可以尝试使用lapply,这稍微简单一些:

lapply(cur$Style.Brand,function(s) dplyr::filter(dem2,Style.Brand == s))

这两个选项的输出应如下所示:

[[1]]
  Brand      Week Units.Sold Style.Brand
1     a 8-20-2017          1          aa

[[2]]
  Brand      Week Units.Sold Style.Brand
1     b 8-20-2017          2          bb

[[3]]
  Brand      Week Units.Sold Style.Brand
1     c 8-20-2017          1          cc

[[4]]
  Brand      Week Units.Sold Style.Brand
1     d 8-20-2017          1          dd

[[5]]
  Brand      Week Units.Sold Style.Brand
1     e 8-20-2017          1          ee

[[6]]
  Brand      Week Units.Sold Style.Brand
1     f 8-20-2017          2          ff
,

如何?

library(dplyr)
cur <-  c("aa","bb","cc","dd","ee","ff")
dem2 <- data.frame(
  `Brand` = c("a","b","c","d","e","f"),`Week` = c("8-20-2017","8-20-2017","8-20-2017"),`Units Sold` = c("1","2","1","2"),`Style-Brand` = c("aa","ff"))

dem <- list() 
j = 1
for (i in cur) {
 dem[[j]] <- dem2 %>% filter(Style.Brand == i)
 j = j + 1
}  
dem
本文链接:https://www.f2er.com/3163115.html

大家都在问