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

时间:2018-01-31 05:21:03

标签: r list dataframe conditional-statements

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

3 个答案:

答案 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步:根据行数创建分组变量Groupi

步骤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)