如何在RStudio中根据条件拆分 Dataframe 列表?[已关闭]

klr1opcd  于 2022-12-25  发布在  其他
关注(0)|答案(1)|浏览(183)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

3天前关闭。
Improve this question
我有一个包含500,000个 Dataframe 的列表。我想根据列值(如果值〉0,如果值=0)将该列表拆分为两个(零,非零)。我该如何操作?
我只知道如何将一个 Dataframe 拆分成多个帧。我不确定是否与拆分一个 Dataframe 列表相同。

kgsdhlau

kgsdhlau1#

我们可以分割每一帧(abs(value) > 0),然后合并结果,或者合并帧,然后再分割。
样本数据,4帧列表:

set.seed(2022)
frames <- replicate(4, data.frame(id=1:4, value=sample(0:1, size=4, replace=TRUE)), simplify = FALSE)
frames[[1]]
#   id value
# 1  1     1
# 2  2     0
# 3  3     1
# 4  4     0

library(dplyr)
bind_rows(frames, .id = "elem") %>%
  split(.$value > 0)
# $`FALSE`
#    elem id value
# 2     1  2     0
# 4     1  4     0
# 5     2  1     0
# 8     2  4     0
# 11    3  3     0
# 12    3  4     0
# 15    4  3     0
# 16    4  4     0
# $`TRUE`
#    elem id value
# 1     1  1     1
# 3     1  3     1
# 6     2  2     1
# 7     2  3     1
# 9     3  1     1
# 10    3  2     1
# 13    4  1     1
# 14    4  2     1

.id="elem"是为了防止您想知道每一行是从原始列表的哪个元素派生出来的。

碱基R

tmp <- do.call(rbind, lapply(seq_along(frames), function(i) transform(frames[[i]], elem = i)))
split(tmp, tmp$value > 0)
# $`FALSE`
#    id value elem
# 2   2     0    1
# 4   4     0    1
# 5   1     0    2
# 8   4     0    2
# 11  3     0    3
# 12  4     0    3
# 15  3     0    4
# 16  4     0    4
# $`TRUE`
#    id value elem
# 1   1     1    1
# 3   3     1    1
# 6   2     1    2
# 7   3     1    2
# 9   1     1    3
# 10  2     1    3
# 13  1     1    4
# 14  2     1    4

数据表

library(data.table)
rbindlist(frames, idcol = "elem")[, list(split(.SD, value > 0))]$V1
# [[1]]
#     elem    id value
#    <int> <int> <int>
# 1:     1     2     0
# 2:     1     4     0
# 3:     2     1     0
# 4:     2     4     0
# 5:     3     3     0
# 6:     3     4     0
# 7:     4     3     0
# 8:     4     4     0
# [[2]]
#     elem    id value
#    <int> <int> <int>
# 1:     1     1     1
# 2:     1     3     1
# 3:     2     2     1
# 4:     2     3     1
# 5:     3     1     1
# 6:     3     2     1
# 7:     4     1     1
# 8:     4     2     1

相关问题