【发布时间】:2014-11-25 12:21:48
【问题描述】:
我需要创建一个复杂的“for”循环,但是在阅读了一些示例之后,我仍然不知道如何以适当的 R 方式编写它,因此我不确定它是否会起作用。我还是一个 R 初学者 :(
我有一个长格式的数据集,有不同的场合,但是,有些场合并不是真正的新场合,因为开始日期是相同的,但有不同的罪行,我需要在一个名为“的新列中复制” offence2",在此之后我需要删除虚假的新场合,以便只保留代表新场合的行。我的真实数据在一个日期最多有 8 种不同的罪行,但我举了一个更简单的例子。
这是我的数据外观的示例
id<-c(1,1,1,2,2,3,3,3,4,4,4,4,5,5,5)
dstart<-c("25/11/2006", "13/12/2006","13/12/2006","07/02/2006","07/02/2006",
"15/01/2006", "22/03/2006","18/09/2006", "04/03/2006","04/03/2006",
"22/08/2006","22/08/2006","11/04/2006", "11/04/2006", "19/10/2006")
dstart1<-as.Date(dstart, "%d/%m/%Y")
offence<-c("a","b","c","b","d","a","a","e","b","a","c","a","a","b","a")
cod_offence<-c(25, 26,27,26,28,25,25,29,26,25,27,25,25,26,25)
mydata<-data.frame(id, dstart1, offence, cod_offence)
数据
id dstart1 offence cod_offence
1 1 2006-11-25 a 25
2 1 2006-12-13 b 26
3 1 2006-12-13 c 27
4 2 2006-02-07 b 26
5 2 2006-02-07 d 28
6 3 2006-01-15 a 25
7 3 2006-03-22 a 25
8 3 2006-09-18 e 29
9 4 2006-03-04 b 26
10 4 2006-03-04 a 25
11 4 2006-08-22 c 27
12 4 2006-08-22 a 25
13 5 2006-04-11 a 25
14 5 2006-04-11 b 26
15 5 2006-10-19 a 25
我需要这样的东西:
id dstart1 offence cod_offence offence2
1 1 2006-11-25 a 25 NA
2 1 2006-12-13 b 26 c
3 1 2006-12-13 c 27 NA
4 2 2006-02-07 b 26 d
5 2 2006-02-07 d 28 NA
6 3 2006-01-15 a 25 NA
7 3 2006-03-22 a 25 NA
8 3 2006-09-18 e 29 NA
9 4 2006-03-04 b 26 a
10 4 2006-03-04 a 25 NA
11 4 2006-08-22 c 27 a
12 4 2006-08-22 a 25 NA
13 5 2006-04-11 a 25 b
14 5 2006-04-11 b 26 NA
15 5 2006-10-19 a 25 NA
我认为我需要做这样的事情: 给定 i = 个人 j=个体内部观察
for each individual I need to check whether mydata$dstart1(j) = mydata$dstart1(j+1)
if this is true, then copy mydata$offence2(j)=mydata$offence(j+1), otherwise keep the same value
This has to stop if id(j) != id(j+1) and re-start with the new id.
我的问题是我不知道如何把它放在一个循环中。
谢谢!!
更新
是的,这个例子可以正常工作,但我的真实数据还没有,因为它们有点复杂 如果我有三个或更多的重复日期而不是两个重复的日期,会发生什么?他们每个人都有不同的罪行。遵循@CathG 解决方案,我需要根据违规次数(在我的情况下为 8)创建更多变量,我想我需要一个新向量来识别 id 内观察的位置和一个新的“指令”,告诉 R根据 mydata$dstart1 的位置,需要将值复制到不同的列中。但话说回来,我不知道该怎么做。
id dstart1 offence cod_offence offence2 offence3 offence4
1 1 2006-11-25 a 25 NA NA NA
2 1 2006-12-13 b 26 c NA NA
3 1 2006-12-13 c 27 NA NA NA
4 2 2006-02-07 b 26 d NA NA
5 2 2006-02-07 d 28 NA NA NA
6 2 2006-04-12 b 26 d c a
7 2 2006-04-12 d 28 NA NA NA
8 2 2006-04-12 c 27 NA NA NA
9 2 2006-04-12 a 25 NA NA NA
再次感谢!!!
【问题讨论】:
-
嗨,是的,它们确实有效!但我认为我的问题仍然存在,因为我问了一个不完整的问题,请你再看一遍好吗?谢谢!
-
@bmora,我刚刚编辑了我的答案以使其适应您的更新。告诉我你现在还好吗
-
@bmora 我还使用您的新数据集编辑了答案。请让我知道它是否有效。