将值从row [i]移动到row [i + 1],以公共索引为条件

时间:2016-04-04 23:49:22

标签: r indexing

我想在一行中复制某些值,并根据常见因素将它们返回到不同的行。 在这里,每个试验中有两个人(一个主体和一个对手),我只记录了该主题的数据。我想“反转”主题的数据并将其粘贴到适当的行中 - 即主题是对手的位置。

示例数据集:

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]的对手数据中,反之亦然。任何帮助深表感谢。

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