R语言 mget与get无法理解的区别

w8biq8rn  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(200)

我对mgetget的工作方式有点困惑
我使用lapply来读取多个 Dataframe (df1,df2)并进行操作,但是当我使用get时,对象被读取,但如果我将其替换为mget,则无法工作,不知道为什么
我注意到的是,如果我使用get,则在全局环境中搜索dataframe并将其读取为dataframe,但是如果我使用mget,则对象将被读取为列表,因此进一步的代码无法工作

df1 <- tribble(
~City_Name,  ~Temp,  ~Pres,  ~Wind_Hor, ~Wind_Ver,  ~S_Moist,  ~Temp1, ~Pres1,  ~Wind1,  ~S_Moist1,
'Mi',  27,  1019,  287,  278,  78,  1,  2,  2,  1,
'Mi',  28,  1019,  289,  277,  78,  2,  2,  1,  3
)

df2 <- tribble(
  ~City_Name,  ~Temp,  ~Pres,  ~Wind_Hor, ~Rainf,  ~S_Moist,  ~Temp1, ~Pres1,  ~Wind1,  ~S_Moist1,
  'Mi',  27,  1019,  287,  278,  78,  1,  2,  2,  1,
  'Mi',  28,  1019,  289,  277,  78,  2,  2,  1,  3
)

dfs1 <- c('df1','df2')

var <- c('City_Name',  'Temp',  'Pres' , 'Wind_Hor' , 'Wind_Ver' , 'Rainf' , 'S_Moist')

lapply(dfs1, \(x) {
  dfn <- mget(x, envir = .GlobalEnv, inherits = T)
  dfn[[var[which(is.na(match(var,names(dfn))))]]] <- NA
  dfn <- dfn %>% select(all_of(var))
  return(assign(x,dfn,envir = .GlobalEnv))
})

字符串

mzillmmw

mzillmmw1#

get只用于查找一个变量并返回存储在变量中的值,而mget查找多个变量并以列表的形式返回它们。你要做的事情可以简化为

lapply(mget(dfs1), \(x) `[<-`(x, setdiff(var, names(x)), value = NA)[var]) |>
   list2env(.GlobalEnv)

df1
# A tibble: 2 × 7
  City_Name  Temp  Pres Wind_Hor Wind_Ver Rainf S_Moist
  <chr>     <dbl> <dbl>    <dbl>    <dbl> <lgl>   <dbl>
1 Mi           27  1019      287      278 NA         78
2 Mi           28  1019      289      277 NA         78

df2
# A tibble: 2 × 7
  City_Name  Temp  Pres Wind_Hor Wind_Ver Rainf S_Moist
  <chr>     <dbl> <dbl>    <dbl> <lgl>    <dbl>   <dbl>
1 Mi           27  1019      287 NA         278      78
2 Mi           28  1019      289 NA         277      78

字符串

enxuqcxy

enxuqcxy2#

下面是mget的解决方案。
从帮助页面?get
按名称搜索对象(get)或零个或多个对象(mget)。
在“值”部分中:
对于get,找到的对象。如果未找到对象,则会产生错误。
对于mget,指对象的命名列表(通过ifnotfound找到或指定)。

suppressPackageStartupMessages(
  library(tibble)
)

df1 <- tribble(
  ~City_Name,  ~Temp,  ~Pres,  ~Wind_Hor, ~Wind_Ver,  ~S_Moist,  ~Temp1, ~Pres1,  ~Wind1,  ~S_Moist1,
  'Mi',  27,  1019,  287,  278,  78,  1,  2,  2,  1,
  'Mi',  28,  1019,  289,  277,  78,  2,  2,  1,  3
)

df2 <- tribble(
  ~City_Name,  ~Temp,  ~Pres,  ~Wind_Hor, ~Rainf,  ~S_Moist,  ~Temp1, ~Pres1,  ~Wind1,  ~S_Moist1,
  'Mi',  27,  1019,  287,  278,  78,  1,  2,  2,  1,
  'Mi',  28,  1019,  289,  277,  78,  2,  2,  1,  3
)

dfs1 <- c('df1','df2')

var <- c('City_Name',  'Temp',  'Pres' , 'Wind_Hor' , 'Wind_Ver' , 'Rainf' , 'S_Moist')

# get all data sets in one call to mget
df_list <- mget(dfs1, envir = .GlobalEnv, inherits = TRUE)
lapply(df_list, \(x) {
  icol <- var[!var %in% names(x)]
  x[icol] <- NA
  x[var]
}) |>
  list2env(envir = .GlobalEnv)
#> <environment: R_GlobalEnv>

df1
#> # A tibble: 2 × 7
#>   City_Name  Temp  Pres Wind_Hor Wind_Ver Rainf S_Moist
#>   <chr>     <dbl> <dbl>    <dbl>    <dbl> <lgl>   <dbl>
#> 1 Mi           27  1019      287      278 NA         78
#> 2 Mi           28  1019      289      277 NA         78

df2
#> # A tibble: 2 × 7
#>   City_Name  Temp  Pres Wind_Hor Wind_Ver Rainf S_Moist
#>   <chr>     <dbl> <dbl>    <dbl> <lgl>    <dbl>   <dbl>
#> 1 Mi           27  1019      287 NA         278      78
#> 2 Mi           28  1019      289 NA         277      78

字符串
创建于2023-07-17带有reprex v2.0.2

相关问题