R:
X Y Z L
.
.
.
a 2 8 0
b 3 2 0
c 12 5 0
d 3 22 0
e 4 33 0
f 2 1 1
g 3 4 0
h 1 2 0
i 2 5 0
j 7 4 0
k 3 3 1
...
如果N是L> 0的次数,我怎么能创建一个以这种方式组成的N个对象的list():
如果i是L> 0的行,则第一个对象将在i-3和i之间从dataframe R获得行,并且这对于所有i行,其中L> 0,如下所示:
list()
[1]
d 3 22 0
e 4 33 0
f 2 1 1
[2]
i 2 5 0
j 7 4 0
k 3 3 1
如果我理解正确,并且R不能做L [5] = 1和L [6] = 1之类的事情,那么如何:
ind = which(R[, "L"] > 0)
res = vector(mode = "list", length = length(ind))
for (iind in seq_along(ind)) {
res[[iind]] = R[(ind[iind]-2):ind[iind],]
}
我减去了i-2
,因为你的输出有3行。如果R
是一个矩阵,那么列表res
中的结果将是矩阵。如果需要,您可以围绕该子集操作包装as.data.frame()
以获取data.frame
s。
没有for循环的解决方案。
第1步:将i
设置为3
第2步:将数据框dat
子集设置为右行
第3步:根据行数和Group
创建分组变量i
第4步:根据Group
拆分数据框
步骤5:删除每个子集的Group
列
i <- 3
dat2 <- dat[as.vector(sapply(which(dat$L == 1), function(x) x + seq(-i + 1, 0))), ]
dat2$Group <- rep(1:(nrow(dat2)/i), each = i)
dat_list <- split(dat2, dat2$Group)
dat_list <- lapply(dat_list, function(x){
x$Group <- NULL
return(x)})
这是结果
dat_list
# $`1`
# X Y Z L
# 4 d 3 22 0
# 5 e 4 33 0
# 6 f 2 1 1
#
# $`2`
# X Y Z L
# 9 i 2 5 0
# 10 j 7 4 0
# 11 k 3 3 1
数据
dat <- read.table(text = " X Y Z L
a 2 8 0
b 3 2 0
c 12 5 0
d 3 22 0
e 4 33 0
f 2 1 1
g 3 4 0
h 1 2 0
i 2 5 0
j 7 4 0
k 3 3 1",
header = TRUE, stringsAsFactors = FALSE)
我认为这将有效,除了数据集的两个第一行:
df<-data.frame(X=letters, Y=rnorm(26,0,1),L=rbinom(26,1,0.5))
df
List<-list()
for (i in 3:length(df$X)) {
if (df$L[i] == 1) {
a <- df[(i-2):i,]
} else { a<-NULL
}
List[[length(List)+1]] = a
}
List