R 按条件对数据帧列表进行子集设置

R 按条件对数据帧列表进行子集设置,r,sorting,R,Sorting,对不起,我还不能嵌入图片 我在一个列表中有21个数据帧(listb),所有的标题都是相同的Timestamp,rainment 我想通过降雨(降序)对它们进行排序,然后对21个数据帧中的前30个数据帧(包括相应的时间戳)进行子集。然后将它们放回一个数据帧中,以初始数据帧的名称作为标题 请在下面找到数据帧列表,以及从b1数据帧中剪下的一小部分 我是否需要为每个新子集创建一个新的数据帧,然后将它们合并到一个列表中 Descending_b1 <- listb$b1[order(-Rainfal

对不起,我还不能嵌入图片

我在一个列表中有21个数据帧(
listb
),所有的标题都是相同的
Timestamp
rainment
我想通过
降雨
(降序)对它们进行排序,然后对21个数据帧中的前30个数据帧(包括相应的
时间戳
)进行子集。然后将它们放回一个数据帧中,以初始数据帧的名称作为标题

请在下面找到数据帧列表,以及从
b1
数据帧中剪下的一小部分

我是否需要为每个新子集创建一个新的数据帧,然后将它们合并到一个列表中

Descending_b1 <- listb$b1[order(-Rainfall),]

b1_30 <- Descending_b1[1:30,1:2]
2013年1月24日
#> 2640   2/2/2004      131
#> 4874  21/3/2010      131
#> 7183  16/7/2016      129
#> 4826   1/2/2010      122
#> 3725  26/1/2007      112
#> 939  29/12/1998      109
#> 4118  24/2/2008      101
#> 2278   5/2/2003       94
#> 2279   6/2/2003       92
#> 1827 11/11/2001       88
#> 5131  3/12/2010       82
#> 8514   8/3/2020       81
#> 5155 27/12/2010       78
#> 605   29/1/1998       74
#> 7642 18/10/2017       71
#> 3771  13/3/2007       69
#> 3429   5/4/2006       65
#> 3495  10/6/2006       64
#> 4387 19/11/2008       64
#> 6671  20/2/2015       64
#> 6340  26/3/2014       63
#> 7425  15/3/2017       63
#> 5398  27/8/2011       62
#> 5950   1/3/2013       61
#> 815   27/8/1998       60
#> 5566  11/2/2012       60
#> 4105  11/2/2008       58
#> 5916  26/1/2013       57

是的,我希望用列表中的其余数据帧创建一个新的数据帧,同时保留初始数据帧名称,然后将它们合并到一个新列表中

set.seed(2021)
listb <- list(b1 = data.frame(Timestamp = as.Date("2010-01-01") + days(sample(1:100, 10)),
              Rainfall = sample(200:300, 10)),
b2 = data.frame(Timestamp = as.Date("2010-01-01") + days(sample(1:100, 10)),
                Rainfall = sample(200:300, 10)),
b3 = data.frame(Timestamp = as.Date("2010-01-01") + days(sample(1:100, 10)),
                Rainfall = sample(200:300, 10)))

> listb
$b1
    Timestamp Rainfall
1  2010-01-08      275
2  2010-02-08      250
3  2010-02-16      259
4  2010-02-28      217
5  2010-01-13      298
6  2010-03-12      202
7  2010-03-06      245
8  2010-04-10      225
9  2010-03-11      235
10 2010-01-24      285

$b2
    Timestamp Rainfall
1  2010-02-01      242
2  2010-04-09      258
3  2010-01-20      269
4  2010-03-10      285
5  2010-03-28      298
6  2010-01-06      262
7  2010-03-15      278
8  2010-03-05      233
9  2010-02-08      221
10 2010-01-19      215

$b3
    Timestamp Rainfall
1  2010-03-21      216
2  2010-03-30      240
3  2010-01-18      230
4  2010-01-21      272
5  2010-03-10      292
6  2010-04-05      226
7  2010-03-14      210
8  2010-03-25      235
9  2010-03-09      237
10 2010-01-03      278
如果要将输出返回到类似的列表中

purrr::map(listb,  ~ .x %>% 
               slice_max(Rainfall, n=5))

$b1
   Timestamp Rainfall
1 2010-01-13      298
2 2010-01-24      285
3 2010-01-08      275
4 2010-02-16      259
5 2010-02-08      250

$b2
   Timestamp Rainfall
1 2010-03-28      298
2 2010-03-10      285
3 2010-03-15      278
4 2010-01-20      269
5 2010-01-06      262

$b3
   Timestamp Rainfall
1 2010-03-10      292
2 2010-01-03      278
3 2010-01-21      272
4 2010-03-30      240
5 2010-03-09      237

图像不是发布数据(或代码)的好方法。看到了吗。您能否以
dput
格式发布样本数据?请使用您尝试过的代码和
dput(b1)
的输出编辑问题。或者,如果dput(head(b1,20))的输出太大。得到结果后,使用
cbind
作为列进行堆栈,或者使用`rbind作为行进行组合
do.call(rbind,lappy(listb,function(x)head(x[order(-x$rainval),],30))
@AnilGoyal不应该有什么不同..fixedIt只是一个小错误,因为我没有从R复制和粘贴代码。变量名应该是相同的。进一步的问题是,我如何才能做到这一点,但仅限于2000年1月1日之后的日期?请提供excel文件的链接,如果驱动器上有?
purrr::map2_dfr(listb, names(listb), ~ .x %>% 
          mutate(list_name = .y) %>%
           slice_max(Rainfall, n=5))

    Timestamp Rainfall list_name
1  2010-01-13      298        b1
2  2010-01-24      285        b1
3  2010-01-08      275        b1
4  2010-02-16      259        b1
5  2010-02-08      250        b1
6  2010-03-28      298        b2
7  2010-03-10      285        b2
8  2010-03-15      278        b2
9  2010-01-20      269        b2
10 2010-01-06      262        b2
11 2010-03-10      292        b3
12 2010-01-03      278        b3
13 2010-01-21      272        b3
14 2010-03-30      240        b3
15 2010-03-09      237        b3
purrr::map(listb,  ~ .x %>% 
               slice_max(Rainfall, n=5))

$b1
   Timestamp Rainfall
1 2010-01-13      298
2 2010-01-24      285
3 2010-01-08      275
4 2010-02-16      259
5 2010-02-08      250

$b2
   Timestamp Rainfall
1 2010-03-28      298
2 2010-03-10      285
3 2010-03-15      278
4 2010-01-20      269
5 2010-01-06      262

$b3
   Timestamp Rainfall
1 2010-03-10      292
2 2010-01-03      278
3 2010-01-21      272
4 2010-03-30      240
5 2010-03-09      237