【问题标题】:Conditional subset based on summing adjacent columns in R (plyr package?)基于对 R 中相邻列求和的条件子集(plyr 包?)
【发布时间】:2013-03-21 04:24:10
【问题描述】:

我正在寻找一种更有效的方法来在 R 中创建子集。使用行 = 产品和列 = 时间的数据集,我想找到商品在第 1 周开始销售的那些行(产品),然后使它成为一个子集。然后对第 2 周做同样的事情,等等。

set.seed(4); d <- data.frame(
 product = seq(1:10),
 week1= sample(0:1,10,replace=TRUE), 
 week2= sample(0:3,10,replace=TRUE),
 week3=sample(0:5,10,replace=TRUE), 
 week4= sample(0:5,10,replace=TRUE),speed=sample(100:200,10),quality=sample(20:50,10)
)

完整的数据帧是 d。所以我需要知道两件事才能找到所有子集: 1) 前几周的销售额为 ==0 ,然后 2) 本周的销售额不为零。

任何子集都不应重叠,因为它们是按照产品首次进入市场时对产品进行分组的。

我找到了一个穷人的方法来做到这一点,但我知道必须有更好的方法!

无效的方式:

subset3<-d[d$week3 >0 & d$week2==0 & d$week1==0 ,]
subset4<-d[d$week4 >0 & d$week3 ==0 & d$week2==0 & d$week1==0,]

效率略高,但仍然很差

subset3<-d[d$week3 >0 & d$week2+d$week1==0 ,]
subset4<-d[d$week4 >0 & d$week3 + d$week2 + d$week1==0,]

感觉我应该可以做这样的事情,但它不起作用:

subset4<-d[d$week4 >0 & sum(d$week1:d$week3) ==0, ]

我认为 ddply 或 apply 在这里不起作用,但也许我错了? 我需要的结果是 d 的子集,所有的列,像这样:

子集3=

product week1 week2 week3 week4 speed quality
   2     0     0     5     1   124      42
   3     0     0     3     5   155      45

【问题讨论】:

  • 什么?那是什么编程语言?你想做什么?请阅读常见问题解答:stackoverflow.com/faq。就目前而言,我严重怀疑我们能否有效地为您提供帮助。
  • 是的,我现在知道这一点,因为用户在 34 分钟前将其编辑到问题中。 Fwiw 我仍然认为这个问题需要重新表述。
  • 对不起,我正在尝试阅读常见问题解答,以便更容易理解。我现在发布了应该有帮助的可重现数据。感谢您的耐心等待!
  • @user2205744 现在好多了,但是您应该添加预期的结果。注意这里你使用随机数据而不修复seed

标签: r plyr subset inventory


【解决方案1】:

你可以使用类似的东西:

d$weekstart <- apply(d[,-1],1,function(x) which(x>0)[1] )

这将确定每个产品的第一个非零销售周。 然后,您可以使用此列拆分数据集,如下所示:

result <- split(d,d$weekstart)

然后您可以像这样访问每个子集:

result[[1]]

将上述代码中的1 更改为您要访问的起始周将类似于拥有subset1 subset2 等。

【讨论】:

  • 哇。这很不错。对象“结果”是一个列表,而我正在寻找创建数据框,但我知道这只是一步之遥。
  • 我相信这是我一直在寻找的最终答案。我怎样才能结束这个问题?谢谢!
  • @user2205744 - 只需勾选您已经完成的答案标记即可。很高兴我能提供帮助。
【解决方案2】:

我希望我能理解你想要做什么。这里尝试使用rle 函数。我将它应用于每一行。(每个产品)。

ll <- apply(d,1,function(x){
  y <- rle(x)
  nn <- names(y$lengths[y$values ==0])
  vv <- y$lengths[y$values ==0]
  if(length(nn)==0)
    res <- data.frame(nbr=0,goodweek='week1')
  else
   res <- data.frame(nbr=vv,goodweek=nn)
})


do.call(rbind,ll)
       nbr goodweek
week3    2    week3  ## 2 bad weeks with 0 then week3 is good 0 0 value>0
week31   2    week3
3        0    week1
week4    1    week4
week2    1    week2
6        0    week1 ## all weeks are good
week41   1    week4
8        1          ## the last week is bad! I dont' know what to return here!
9        0    week1
week21   1    week2

我在这里使用你的 d :

d
   week1 week2 week3 week4
1      0     0     5     2
2      0     0     1     3
3      1     2     3     2
4      1     1     0     1
5      0     3     1     4
6      1     1     2     4
7      1     2     0     4
8      1     3     2     0
9      1     1     5     4
10     0     3     2     2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    相关资源
    最近更新 更多