【问题标题】:R create column in dataframe value name of dataframeR在数据框的数据框值名称中创建列
【发布时间】:2021-01-18 09:21:46
【问题描述】:

我有一个数据框列表(这些是空间数据框),例如“map_g1_r1_airport”、“map_g1_r1_hotel”、“map_g1_r2_bank”、“map_g1_r2_market”

这些元素是从多张地图中数字化的。这些地图最初被称为“map_g1_r1”、“map_g1_r2”。

我正在尝试使用循环为每个数据框添加一个带有原始地图名称的列。

这是我想要做的:

map_g1_r1_airport$mapid<-map_g1_r1
With the loop (Unfortunately this does not do what I intend to do. Instead it simply creates a "content" field in the Values board.):
list_df<-c("map_g1_r1_airport", "map_g1_r1_hotel", "map_g1_r2_bank", "map_g1_r2_market")
    for (df in 1:length(list_df)){
      paste(list_df[df],"$mapid<-", 
                    print(content<-gsub("(.*)_.*","\\1", 
                    c(paste(list_df[df]))),sep=""), 
                    quote=FALSE)}

欢迎任何帮助!

以下是更改前数据的一个示例:

structure(list(id = c(1, 2, 3), Name = structure(c(1L, 3L, 4L
), .Label = c("A", "B", "C", "D", "E"
), class = "factor"), Year = structure(c(NA_integer_, NA_integer_, 
NA_integer_), .Label = character(0), class = "factor"), geometry = structure(list(
    structure(c(41.4086152370865, 2.44718243982123), class = c("XY", 
    "POINT", "sfg")), structure(c(45.3852740543083, -4.31103098867136
    ), class = c("XY", "POINT", "sfg")), structure(c(38.4200314592624, 
    -6.96113884231683), class = c("XY", "POINT", "sfg"))), class = c("sfc_POINT", 
"sfc"), precision = 0, bbox = structure(c(xmin = 41.4086152370865, 
ymin = 2.31103098867136, xmax = 45.4200314592624, ymax = -4.44718243982123
), class = "bbox"), crs = structure(list(epsg = NA_integer_, 
    proj4string = NA_character_), class = "crs"), n_empty = 0L)), sf_column = "geometry", agr = structure(c(id = NA_integer_, 
Name = NA_integer_, Year = NA_integer_), .Label = c("constant", 
"aggregate", "identity"), class = "factor"), row.names = c(NA, 
3L), class = c("sf", "data.frame"))

这就是我想要得到的(使用 mapid ma​​p_g1_r1):

structure(list(id = c(1, 2, 3), Name = structure(c(1L, 3L, 4L
), .Label = c("A", "B", "C", "D", "E"
), class = "factor"), Year = structure(c(NA_integer_, NA_integer_, 
NA_integer_), .Label = character(0), class = "factor"), geometry = structure(list(
    structure(c(41.4086152370865, 2.44718243982123), class = c("XY", 
    "POINT", "sfg")), structure(c(45.3852740543083, -4.31103098867136
    ), class = c("XY", "POINT", "sfg")), structure(c(38.4200314592624, 
    -6.96113884231683), class = c("XY", "POINT", "sfg"))), class = c("sfc_POINT", 
"sfc"), precision = 0, bbox = structure(c(xmin = 41.4086152370865, 
ymin = 2.31103098867136, xmax = 45.4200314592624, ymax = -4.44718243982123
), class = "bbox"), crs = structure(list(epsg = NA_integer_, 
    proj4string = NA_character_), class = "crs"), n_empty = 0L), 
    mapid = c("map_g1_r1", "map_g1_r1", "map_g1_r1")), sf_column = "geometry", agr = structure(c(id = NA_integer_, 
Name = NA_integer_, Year = NA_integer_, mapid = NA_integer_), .Label = c("constant", 
"aggregate", "identity"), class = "factor"), row.names = c(NA, 
3L), class = c("sf", "data.frame"))

【问题讨论】:

  • 你能用dput给我们一个df的例子吗?
  • @RonakShah,map_g1_r1_airport 有三列(id/city/size)和两行。 map_g1_r2_bank 有四列(id/city/size/branch),只有一行。
  • @RonakShah 我添加了必要的信息。

标签: r loops


【解决方案1】:

即使没有循环,您也可以实现。

我首先会创建一个列表,其中包含您希望在每个空间 data.frame 中看到的名称。我假设它们来自列表的名称。

mapid = names(list_df)

接下来你可以使用mapply 来使用一个函数 列表(或向量)的第一个元素和另一个列表/向量的第一个元素。它们继续前进并将相同的函数应用于每个向量的第二个元素。它本质上是lapply 的多输入版本。

我们将给mapply 的函数是cbind,它创建需要两个data.frames 并按列连接它们。在这种情况下,一个 data.frame 将是您的空间对象,另一个将是具有一个元素的向量:当前地图名称。 cbind 自然会将此名称转换为 1 列 data.frame 并重复名称以匹配空间对象中的行数。

final = mapply(cbind, list_df, mapid)

我还没有测试过,但它应该可以工作。

【讨论】:

  • 亲爱的@JMenezes,不幸的是我有 44 个 mapid 和 177 个 list_df。尽管您的解决方案看起来很有希望,但我无法实施。
【解决方案2】:

您可以使用mget 获取列表中的所有单个数据框,并使用mutate 添加带有其名称的新列。

使用tidyverse 函数,您可以这样做:

library(dplyr)
library(purrr)

list_df<-c("map_g1_r1_airport", "map_g1_r1_hotel", "map_g1_r2_bank", "map_g1_r2_market")
tmp <- mget(list_df)

result <- imap(tmp, ~.x %>% mutate(map_id = .y))

result 将在列表中包含所有更改的数据框,如果您希望这些更改反映在原始对象中,您可以使用 list2env

list2env(result, .GlobalEnv)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-10
    • 2020-09-29
    • 2017-12-10
    • 2019-04-06
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多