【发布时间】: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