基于R中相邻列求和的条件子集(plyr包?)

基于R中相邻列求和的条件子集(plyr包?),r,plyr,subset,inventory,R,Plyr,Subset,Inventory,我正在寻找一种更有效的方法来在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

我正在寻找一种更有效的方法来在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$weekstart <- apply(d[,-1],1,function(x) which(x>0)[1] )

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

我希望我理解您的意图。这里尝试使用
rle
函数。我将其应用于每一行(每种产品)


什么?那是什么编程语言?你想干什么?请阅读常见问题解答:。就目前情况而言,我严重怀疑我们能否有效地帮助您。是的,我现在知道了,因为用户在34分钟前将其编辑成了问题。Fwiw我仍然认为这个问题需要重新措辞。对不起,我正在努力阅读faq,让它更容易理解。我现在发布了可复制的数据,这应该会有所帮助。我感谢你的耐心@user2205744现在更好了,但是您应该添加预期的结果。注意,这里使用的是随机数据,没有固定
种子。这很好。对象“result”是一个列表,而我一直在寻找创建数据帧的方法,但我发现这离创建数据帧还有一步之遥。我相信这是我一直在寻找的最终答案。我怎样才能结束这个问题?谢谢@user2205744-只需在答案上打勾即可。很高兴我能帮上忙。
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, ]
product week1 week2 week3 week4 speed quality
   2     0     0     5     1   124      42
   3     0     0     3     5   155      45
d$weekstart <- apply(d[,-1],1,function(x) which(x>0)[1] )
result <- split(d,d$weekstart)
result[[1]]
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
   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