【问题标题】:Select df and variables from a list with a reference df for variables selection : R, purrr从带有参考 df 的列表中选择 df 和变量以进行变量选择:R,purrr
【发布时间】:2023-02-24 19:29:58
【问题描述】:

我有一个 df 列表,其中包含不同的变量。

最后,我想从数据框和变量的子选择中得到一个合成数据框,并将其合并为一个。 我有另一个 df,其中包含感兴趣的变量列表和相应的表。

当然,要在简单的 df 上进行选择,只需进行 select(colnames(.) %in% VarSel$Var) 并对所有 df 进行选择,然后进行连接... 但是,就目前而言,我不能直接在所选 df 列表中的 purrr 中执行此操作。

你知道如何正确地做到这一点吗?


# reprex

## a list of df 

list_df <- list(A = data.frame(ID = letters[1:10],
                               Var1 = rnorm(10),
                               Var2 = rnorm(10),
                                Var3 = rnorm(10)),
                B = data.frame(ID = letters[1:10],
                               Var1 = rnorm(10),
                               VarY = rnorm(10),
                               VarX = rnorm(10)),
                D = data.frame(ID = letters[5:14],
                               Var1 = rnorm(10),
                               VarZ = rnorm(10),
                               Var3 = rnorm(10)),
                E = data.frame(ID = letters[3:12],
                               Var1 = rnorm(10),
                               VarK = rnorm(10),
                               Var3 = rnorm(10)))

## a df for variables & df selection 

VarSel <- data.frame(Var = c("ID", "VarZ", "Var3", "Var3", "VarK"),
                     Df = c("all", "D", "A", "D", "E"))



# the 3 operations that I want to perform (I simply managed the first one)

list_df %>% 
  keep(names(.) %in% unique(VarSel$Df))# keep only df named in VarSel 
                                       # then select matching variable names for thoses DF (not forgetting the ID one) 
                                       # finally produce a synthesis Df joining A & D and variables of interest (ID, VarZ, Var3, Var3)

# desired output 
output <- full_join(list_df[["A"]], list_df[["D"]], by = "ID") %>%
full_join(.,list_df[["E"]], by= "ID") %>% 
select(ID, VarZ, Var3_A = Var3.x, Var3_D = Var3.y, VarK)


【问题讨论】:

  • 我尝试了几种在 map() 中使用 select 和 %in% 函数的方法,但我没有成功......

标签: r list select tidyverse purrr


【解决方案1】:

你可以这样做:

library(purrr)
map2_dfc(list_df[VarSel$Df], VarSel$Var, ~ .x[.y])

#    ID       VarZ   Var3...3    Var3...4
# 1   a  1.0215807 -0.9307522 -0.79314560
# 2   b -1.3861810 -1.1376876 -3.06921836
# 3   c  0.4661697  0.3690057 -0.08778707
# 4   d  0.1365207  0.5290638  0.86164346
# 5   e  0.5498877 -0.6208638 -2.22677452
# 6   f  0.4925813 -1.3938548  0.21014465
# 7   g  0.3675358  0.8269150 -1.71422099
# 8   h  0.4576200  0.1554632 -1.80290292
# 9   i  0.5560993  0.6597010 -1.43455363
# 10  j  0.2121097 -0.5935487 -1.42085047

请注意,我稍微更改了您的 VarSel 以避免无法识别的 "all"。由于它们都是相同的,所以我选择了“A”。

VarSel <- data.frame(Var = c("ID", "VarZ", "Var3", "Var3"),
                     Df = c("A", "D", "A", "D"))

要获得完全正确的输出,您可以动态创建新名称向量,然后使用 pmap

newnames <- ifelse(duplicated(VarSel$Var) | duplicated(VarSel$Var, fromLast = TRUE), 
                   paste0(VarSel$Var, "_", VarSel$Df), VarSel$Var)
pmap_dfc(list(list_df[VarSel$Df], VarSel$Var, newnames), ~ set_names(..1[..2], ..3))

#    ID       VarZ     Var3_A      Var3_D
# 1   a  1.0215807 -0.9307522 -0.79314560
# 2   b -1.3861810 -1.1376876 -3.06921836
# 3   c  0.4661697  0.3690057 -0.08778707
# 4   d  0.1365207  0.5290638  0.86164346
# 5   e  0.5498877 -0.6208638 -2.22677452
# 6   f  0.4925813 -1.3938548  0.21014465
# 7   g  0.3675358  0.8269150 -1.71422099
# 8   h  0.4576200  0.1554632 -1.80290292
# 9   i  0.5560993  0.6597010 -1.43455363
# 10  j  0.2121097 -0.5935487 -1.42085047

【讨论】:

  • 谢谢,这是一个很好的解决方案。我知道“所有”问题,这就是为什么我首先尝试使用 %in% 运算符来确保从所有选定的 df 中恢复 ID
  • 抱歉,我刚刚意识到我的代表(输入和输出)具有误导性。我编辑了,我实际上想执行一个连接。
猜你喜欢
  • 1970-01-01
  • 2014-09-08
  • 2019-09-06
  • 1970-01-01
  • 2013-12-16
  • 2021-03-11
  • 2019-08-30
  • 2015-04-10
  • 2013-07-26
相关资源
最近更新 更多