如何使用来自另一个 Dataframe 的值对一个 Dataframe 进行子集化?

3pmvbmvn  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(157)

假设我有一个表示子集brief的 Dataframe ,我们将其命名为brief,这里的值是子集规则。

library(tidyverse)

brief <- data.frame(apple = 1, orange = 2, pear = 3)

在第二个 Dataframe (称为types)中,这是我想要划分子集的数据。

types <- data.frame(apple_cake = rnorm(5,0,1),
                    apple_pie = rnorm(5,0, 1),
                    apple_ice = rnorm(5,0, 1),
                    orange_cake = rnorm(5,0,1),
                    orange_pie = rnorm(5, 0, 1),
                    orange_ice = rnorm(5,0, 1),
                    pear_cake = rnorm(5,0,1),
                    pear_pie = rnorm(5, 0, 1),
                    pear_ice = rnorm(5,0, 1)
)

在我的示例中,我希望使用 Dataframe 1和 Dataframe 2对特定的苹果、橙子和梨食品项进行子集化。我希望使用第一个 Dataframe brief中的值对第二个 Dataframe types中的列进行子集化。
最后,我想给出一个最终的 Dataframe ,如下所示:

final <- types %>% 
  select(apple_cake, orange_pie, pear_ice)

在最终解决方案中,苹果项1、橙子项2和梨项3保留。
我尝试了各种dplyr函数,但没有效果。我也寻找类似的solutions,但不认为他们解决了我的问题,因为这些例子可能有两个 Dataframe 类似的列名。

atmip9wb

atmip9wb1#

base R中,我们通过拆分后缀已删除的列名,将数据列拆分为具有相似前缀的list Dataframe 。从brief数据中的相应索引中提取([)列,Mapcbindlist数据中的相应索引中提取列,do.call

do.call(cbind,  Map(`[`, split.default(types, trimws(names(types), 
       whitespace = "_.*")), brief))
  • 输出
apple_cake   orange_pie   pear_ice
1  0.9065347  0.661994002  0.1988529
2  1.0429968  0.736754956  0.9714787
3  0.5517950 -0.003860467  0.4486231
4 -0.4304989  1.160817987 -0.3410640
5 -0.1701651  0.489398131 -1.1846220

或者,另一种选择是循环遍历数据。使用imapselectbrief,使用select-helper(starts_with)遍历列,遍历brief数据列(.y)的名称,然后基于brief列(.x)的值索引遍历select

library(dplyr)
library(purrr)
imap_dfc(brief, ~ types %>%
     select(starts_with(.y)) %>% 
     select(all_of(.x)))
  apple_cake   orange_pie   pear_ice
1  0.9065347  0.661994002  0.1988529
2  1.0429968  0.736754956  0.9714787
3  0.5517950 -0.003860467  0.4486231
4 -0.4304989  1.160817987 -0.3410640
5 -0.1701651  0.489398131 -1.1846220

相关问题