-2

我有重复测量的数据。

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

我是编写循环的新手。我的逻辑是,对于唯一 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)
    }
}

谢谢!贾斯汀

4

3 回答 3

4

您还可以使用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
于 2012-08-22T16:37:28.510 回答
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)
}

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

于 2012-08-22T13:58:17.207 回答
1

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

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 不是很酷吗!?)

于 2012-08-22T16:30:22.543 回答