首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个循环,如果满足条件,则计数在colum中包含字符串的行数(相同的ID)。

一个循环,如果满足条件,则计数在colum中包含字符串的行数(相同的ID)。
EN

Stack Overflow用户
提问于 2020-12-07 15:33:35
回答 2查看 67关注 0票数 0

这里的初学者。我的数据如下所示:每个ID每天都被记录下来(Date),实验对象在研究中。此外,测试对象所在的也会被记录下来。试验对象可以是M组或任何其他组(K组或1-10组).我想把每一天的计数(daysinM)作为输出,测试对象在M组中的天数是M组,所以如果试验对象在M组中15次,今天在第7组,则计数仍然是15天,直到在M组中度过另一天。

下面是我的一个例子:

代码语言:javascript
复制
ID <- c(2,2,2,2,2,5,5,5,5,7,7,7,7,7,7)
Date <- c("2020-1-1", "2020-1-2", "2020-1-3", "2020-1-4", "2020-1-5", 
          "2020-2-1", "2020-2-2", "2020-2-3", "2020-2-4", 
          "2020-1-1", "2020-1-2", "2020-1-3", "2020-1-4", "2020-1-5", "2020-1-6")
Date <- as.Date(Date)
Group <- c("2", "M", "M", "K", "M", "M", "M", "7", "M", "K", "M", "M", "M", "3", "M")
daysinM <- c(0, 1, 2, 2, 3, 1, 2, 2, 3, 0, 1, 2, 3, 3, 4)
Data = data.frame(ID, Date, Group, Count)

我知道我需要一个循环,但我想不出来。以下是我尝试过的:

代码语言:javascript
复制
Data$daysinM=0
 
for (i in 1:(nrow())){
  if (Data$Group == "M" && (Data[i+1,which(colnames(Data)=="ID")]==Data[i,which(colnames(Data)=="ID")])) 
    daysinM=daysinM+1
    Data[i,ncol(Data)+1]<-daysinM  
  }
}

请用防白痴的语言。

EN

回答 2

Stack Overflow用户

发布于 2020-12-07 16:25:19

如果您感兴趣,可以使用tidyverse (在本例中,只使用dplyr包),并尝试如下所示。

%>%将从一行“管道”到下一行。从您的Data开始,您可以使用group_by,以便为每个组完成后续操作(在本例中,每个ID)。

然后,mutate允许您更改或创建数据中的列。我们创建一个新的列daysinM,它等于Group为"M“的累积和。

代码语言:javascript
复制
library(dplyr)

Data %>%
  group_by(ID) %>%
  mutate(daysinM = cumsum(Group == "M"))

在基本R中(没有任何附加包),您可以这样做:

代码语言:javascript
复制
Data$daysinM <- ave(Data$Group == "M", Data$ID, FUN = cumsum)

在本例中,您可以使用ave根据组创建较小的向量(在本例中为ID)。对于每一个较小的向量,我们再次进行累积和,其中Group是"M“。

输出

代码语言:javascript
复制
      ID Date       Group daysinM
   <dbl> <date>     <chr>   <int>
 1     2 2020-01-01 2           0
 2     2 2020-01-02 M           1
 3     2 2020-01-03 M           2
 4     2 2020-01-04 K           2
 5     2 2020-01-05 M           3
 6     5 2020-02-01 M           1
 7     5 2020-02-02 M           2
 8     5 2020-02-03 7           2
 9     5 2020-02-04 M           3
10     7 2020-01-01 K           0
11     7 2020-01-02 M           1
12     7 2020-01-03 M           2
13     7 2020-01-04 M           3
14     7 2020-01-05 3           3
15     7 2020-01-06 M           4
票数 0
EN

Stack Overflow用户

发布于 2020-12-07 20:44:32

带有data.table的选项

代码语言:javascript
复制
library(data.table)
setDT(Data)[, daysinM :=  cumsum(Group == "M"), ID]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65184659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档