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> 1的次数。 0,如何创建一个以这种方式组成的N个对象的list():
如果i是L> 0的行,则第一个对象将在i-3和i之间从数据帧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
答案 0 :(得分: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
。
答案 1 :(得分:0)
我认为这会有效,除了数据集的两个第一行:
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
答案 2 :(得分:0)
没有for-loop的解决方案。
第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)