【问题标题】:Count and label observations per participant using loop使用循环计数和标记每个参与者的观察结果
【发布时间】:2012-08-22 13:50:04
【问题描述】:

我有重复测量的数据。

我需要创建一个循环,对参与者内的每个观察结果进行递增计数,并对其进行标记。

我是编写循环的新手。我的逻辑是,对于唯一 id 列表中的每个项目,计算其中的每一行,并将某些函数应用于该行。

有人能指出我做错了什么吗?

data$Ob <- 0

for (i in unique(data$id)) {
  count <- 1
  for (u in data[data$id == i,]) {
      data[data$id ==u,]$Ob <- count
      count <- count + 1
      print(count)
    }
}

谢谢! 贾斯汀

【问题讨论】:

  • 能否提供一个可重现的例子?

标签: r loops


【解决方案1】:

你也可以使用ave:

set.seed(1)
data <- data.frame(id = sample(4, 10, TRUE))
data$Ob = ave(data$id, data$id, FUN=seq_along)
data
   id Ob
1   2  1
2   2  2
3   3  1
4   4  1
5   1  1
6   4  2
7   4  3
8   3  2
9   3  3
10  1  2

【讨论】:

    【解决方案2】:
    # Generate some dummy data
    data <- data.frame(Ob=0, id=sample(4,20,TRUE))
    
    # Go through every id value
    for(i in unique(data$id)){
        # Label observations
        data$Ob[data$id == i] = 1:sum(data$id == i)
    }
    

    请注意,尽管 for 循环在 R 中的速度非常慢。在这种简单的情况下,它们可以正常工作,但如果您的数据框中有数百万行,您最好做一些纯矢量化的操作。

    【讨论】:

    • +1 表示创造性的解决方案。我不得不查看@Blacklin 的解决方案才能理解这个问题......
    【解决方案3】:

    但你不需要循环......

    data <- data.frame (id = sample (4, 10, TRUE))
    
    ##    id
    ## 1   3
    ## 2   4
    ## 3   1
    ## 4   3
    ## 5   3
    ## 6   4
    ## 7   2
    ## 8   1
    ## 9   1
    ## 10  4
    
    data$Ob  [order (data$id)] <- sequence (table (data$id))
    
    ##    id Ob
    ## 1   3  1
    ## 2   4  1
    ## 3   1  1
    ## 4   3  2
    ## 5   3  3
    ## 6   4  2
    ## 7   2  1
    ## 8   1  2
    ## 9   1  3
    ## 10  4  3
    

    (也适用于字符或因子 ID)

    (R 不是很酷吗!?)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-30
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      相关资源
      最近更新 更多