【问题标题】:Move value from row[i] to row[i+1], conditional on a common index将值从 row[i] 移动到 row[i+1],以公共索引为条件
【发布时间】:2016-04-04 23:49:22
【问题描述】:

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

一个示例数据集:

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

【问题讨论】:

    标签: r indexing


    【解决方案1】:

    您可以在行索引上使用模运算符%%

    c(1:8) %% 2
    [1] 1 0 1 0 1 0 1 0
    

    这将在for 循环内的if 语句中使用:

    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:我建议在您的data.frame 中设置stringsAsFactors = FALSE

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      • 2012-04-13
      • 2021-10-08
      • 2012-08-25
      • 2018-07-29
      • 2011-07-24
      相关资源
      最近更新 更多