【问题标题】:R loops:conditioning a loop in RR 循环:调节 R 中的循环
【发布时间】:2016-03-18 11:20:51
【问题描述】:

感谢您的反馈,下面是我想要的输出的可重现示例:

# Example Data where I would like my output
N=24 
school.assignment = matrix(NA, ncol = 3, nrow = N)
school.assignment = as.data.frame(school.assignment)
colnames(school.assignment)  <- c("ID","Group","Assignment")

# Number of groups and assigments per group
groups = 6 
Assignment = 4 
school.assignment$Group<-rep(1:groups,Assignment)
school.assignment$Group<- sort(school.assignment$Group)
school.assignment$Assignment<-rep(1:Assignment)


# IDs with number of repeats (i.e repeated students)
Data = matrix(0, ncol = 2, nrow = N/2) # ~half with repeated samples
Data = as.data.frame(Data)
colnames(Data) <- c("ID","Repeats")
Data$ID <-1:(N/2)
length(unique(Data$ID)) # unique IDS
ID=rep(seq(1:8),3)

# Genearte random repeats for each ID
Data$Repeats<-{set.seed(55)
               sapply(1:(N/2), 
                      function(x) sample(1:5,1))
}
Data=Data[-1,] #take out first row to match N=24
sum(Data$Repeats) #24 total IDs for all assigments 


# List of IDs at random to use
IDs <- vector("list",dim(Data)[1]) #
for (i in 1:dim(Data)[1])
{
  IDs[[i]]<-rep(Data$ID[i], times=Data$Repeats[i])
}
head(IDs)


# Object with number of repeated IDs
sample.per.ID <- vector("list",length(IDs)[1])
for (i in 1:length(IDs))
{
  sample.per.ID[[i]]<-sum(length((IDs)[[i]]))
}
sum=sum(as.data.frame(sample.per.ID)); sum # 24 total IDs (including repeats)

## Unlist Vector with ransom sequence of samples
SRS.ID.order = unlist(IDs) #order of IDs with repeats
for (i in 1:length(SRS.ID.order ))
{
  school.assignment$ID[i]<-SRS.ID.order [i]
}

我的最后一个循环是我尝试将 ID 分配给我的 school.assignment$ID 矩阵。但是,您可以看到一些 ID 跨越不同的组,我想将 SRS.ID.order 中的 ID 分配限制在同一组内(即常量 school.assignment$Group,下面你可以看到不是这样的,例如 ID 4 在第 1 组和第 2 组中)

> head(school.assignment)
  ID Group Assignment
1  2     1          1
2  2     1          2
3  3     1          3
4  4     1          4
5  4     2          1
6  4     2          2

如果下一个 school.assignment$ID 长度比该组中的可用空间长,我希望循环的输出不要为该组分配任何 ID(即 NA)。

  ID Group Assignment
1  2     1          1
2  2     1          2
3  3     1          3
4 NA     1          4
5  4     2          1
6  4     2          2

我在想我需要某种类型的 J 组指标,如下面的代码:

########################################
for (i in 1:length(school.assignment$ID))
{
  for (j in 1:length(unique(school.assignment$Group)))
  {
    school.assignment$ID[i]<-ifelse(sum(is.na(school.assignment$ID[i,j]))>=sample.per.ID[i],SRS.ID.order[i],NA)
  }
}
Error in school.assignment$ID[i, j] : incorrect number of dimensions

非常感谢任何帮助!

谢谢


旧帖

我目前正在尝试在 R 中使用 a 条件进行循环。我的数据结构如下:

> head(school.assignment)
   ID   Group    Assignment
1  NA    1            1
2  NA    1            2
3  NA    1            3
4  NA    1            4
5  NA    2            1
6  NA    2            2

我想将一个与 school.assignment 长度相同的 ID 分配给如下所示的 ID 变量:

head(IDs)
[1] 519 519 519 343 251 251...

并非所有 ID 都重复相同的次数,例如 1,2 甚至 3 次,如上所示。我有一个具有每个 ID 重复次数的对象,例如:

> head(repeats)
[1] 3 1 2...

表示 ID=519 重复 3 次,ID=343 仅重复一次 ad ID=251 2 次等等...

我想满足一个条件:

1) 我希望每个 ID 尽可能在 同一组 中(即,如果矩阵对象“school.assignment”中的 ID 只剩下一个位置 (NA)第 1 组然后将 ID 分配给下一个组,在那里他们将有足够的空间(即 school.assignment$ID 的 NA >= 以重复该 ID)

我的想法是做一个循环,但下面的代码不起作用:

########################################
  for (i in 1:length(school.assignment$ID))
    {
    for (j in 1:length(unique(school.assignment$Group)))
    {
  school.assignment$ID[i]<-ifelse(sum(is.na(school.assignment$ID[i,j]))>=repeats[i],ID[i],NA)
  }
}

有没有办法在尊重我的条件的同时执行此循环以仅将 ID 分配给一个组?

谢谢!

【问题讨论】:

  • 不清楚。请展示一个可重现的小示例和预期输出。
  • 欢迎来到 StackOverflow。 reproducible example 会很有帮助

标签: r loops for-loop while-loop


【解决方案1】:

考虑使用merge() 将随机组ID 分配给数据框。不需要嵌套的 for 循环。下面创建一个唯一的组数据框,在那里分配随机数,然后与school.assignment合并:

# CREATE UNIQUE GROUP DATA FRAME 
Group <- unique(school.assignment$Group)
grp.ids <- as.data.frame(Group)

# CREATE RANDOM ID FIELD (THREE DIGITS BETWEEN 100 AND 999)
grp.ids$RandomID <- sample(100:999, size = nrow(grp.ids), replace = TRUE)

# MERGE DATA FRAMES
school.assignment <- merge(school.assignment, grp.ids, by="Group", all=TRUE)
# ASSIGN ID COLUMN
school.assignment$ID <- school.assignment$RandomID
# RESTRUCTURE FINAL DATA FRAME
school.assignment <- school.assignment[c("ID", "Group", "Assignment")]

输出

 ID     Group   Assignment
977         1            1
977         1            2
977         1            3
977         1            4
368         2            1
368         2            2

【讨论】:

  • 感谢您的回答,这很有用。但是,这假设每组有偶数个 ID。我的问题是组中每个“插槽”的 ID 数量不同。在上面的示例中,每个组都有 4 个潜在的 ID 点。但是,有些 ID 会重复 1,2 或 3 次。我想将重复的 ID 保留在一个组中。我知道这会导致某些组不平衡,但我对此表示同意(即某些组可能最终有 1 或 2 个 NA)。我还应该继续循环吗?
猜你喜欢
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 2023-02-21
  • 2012-11-04
  • 2020-08-29
相关资源
最近更新 更多