我想在一行中复制某些值,并根据常见因素将它们返回到不同的行。 在这里,每个试验中有两个人(一个主体和一个对手),我只记录了该主题的数据。我想“反转”主题的数据并将其粘贴到适当的行中 - 即主题是对手的位置。
示例数据集:
df = data.frame(
section = section,
trial = c(rep(c(rep("trial1",2), rep("trial2",2)),2)),
subject = rep(subjects,2),
rank = c(rep(c(1,4,2,3),2)),
count.given = rnorm(8, m=5, sd = 3),
opponent = rep(NA,(length(section))),
opponent.rank = rep(NA,(length(section))),
count.received = rep(NA,(length(section))))
这是df:
section trial subject rank count.given opponent opponent.rank count.received
1 1 trial1 a 1 11.0552711 NA NA NA
2 1 trial1 b 4 4.8118577 NA NA NA
3 1 trial2 c 2 8.9146090 NA NA NA
4 1 trial2 d 3 11.8599362 NA NA NA
5 2 trial1 a 1 0.8334179 NA NA NA
6 2 trial1 b 4 4.1636337 NA NA NA
7 2 trial2 c 2 4.6000360 NA NA NA
8 2 trial2 d 3 6.9078512 NA NA NA
现在我的目标是用同一部分和同一试验中的相应数据填写对手专栏。例如,第一行对应于第1部分,试验1和主题“a”;因此,对手是第1节,第1节,主体是“b”。反之亦然:“a”是第二行中的对手。
目标是更新df,如下所示:
section trial subject rank count.given opponent opponent.rank count.received
1 1 trial1 a 1 11.0552711 b 4 4.8118577
2 1 trial1 b 4 4.8118577 a 1 11.0552711
3 1 trial1 c 2 8.9146090 d 3 11.8599362
4 1 trial1 d 3 11.8599362 c 2 8.9146090
5 2 trial2 a 1 0.8334179 b 4 4.1636337
6 2 trial2 b 4 4.1636337 a 1 0.8334179
7 2 trial2 c 2 4.6000360 d 3 6.9078512
8 2 trial2 d 3 6.9078512 c 2 4.6000360
我认为最好的方法是按部分和试验对df进行排序,然后为每个试验创建一个对应于[i]和[i + 1]的索引。然后来自[i]的主题数据被粘贴到[i + 1]的对手数据中,反之亦然。任何帮助深表感谢。
答案 0 :(得分:0)
您可以在行索引上使用模数运算符%%
。
c(1:8) %% 2
[1] 1 0 1 0 1 0 1 0
这将用于if
循环中的for
语句:
for(i in 1:8){
if(i %% 2 == 0){
df[i,]$opponent = df[i-1,]$subject
df[i,]$opponent.rank = df[i-1,]$rank
df[i,]$count.received = df[i-1,]$count.given
}else{
df[i,]$opponent = df[i+1,]$subject
df[i,]$opponent.rank = df[i+1,]$rank
df[i,]$count.received = df[i+1,]$count.given
}
}
较短的版本是:
for(i in 1:nrow(df)){
if(i %% 2 == 0){
df[i, c(6:8)] = df[i-1, c(3:5)]
}else{
df[i, c(6:8)] = df[i+1, c(3:5)]
}
}
PS:我建议您在stringsAsFactors = FALSE
中设置data.frame
。