如何使用条件从数据框创建列表

问题描述 投票:0回答:3
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 list dataframe condition
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.frames。


0
投票

没有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)

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
© www.soinside.com 2019 - 2024. All rights reserved.