这里的初学者。我的数据如下所示:每个ID每天都被记录下来(Date),实验对象在研究中。此外,测试对象所在的组也会被记录下来。试验对象可以是M组或任何其他组(K组或1-10组).我想把每一天的计数(daysinM)作为输出,测试对象在M组中的天数是M组,所以如果试验对象在M组中15次,今天在第7组,则计数仍然是15天,直到在M组中度过另一天。
下面是我的一个例子:
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)我知道我需要一个循环,但我想不出来。以下是我尝试过的:
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
}
}请用防白痴的语言。
发布于 2020-12-07 16:25:19
如果您感兴趣,可以使用tidyverse (在本例中,只使用dplyr包),并尝试如下所示。
%>%将从一行“管道”到下一行。从您的Data开始,您可以使用group_by,以便为每个组完成后续操作(在本例中,每个ID)。
然后,mutate允许您更改或创建数据中的列。我们创建一个新的列daysinM,它等于Group为"M“的累积和。
library(dplyr)
Data %>%
group_by(ID) %>%
mutate(daysinM = cumsum(Group == "M"))在基本R中(没有任何附加包),您可以这样做:
Data$daysinM <- ave(Data$Group == "M", Data$ID, FUN = cumsum)在本例中,您可以使用ave根据组创建较小的向量(在本例中为ID)。对于每一个较小的向量,我们再次进行累积和,其中Group是"M“。
输出
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发布于 2020-12-07 20:44:32
带有data.table的选项
library(data.table)
setDT(Data)[, daysinM := cumsum(Group == "M"), ID]https://stackoverflow.com/questions/65184659
复制相似问题