R: извлечь имя вектора из значения в кадре данных - PullRequest
0 голосов
/ 26 марта 2020

Я хотел бы создать векторы из строк данных и использовать одно из значений ячейки в качестве имени вектора. Например:

df <- data.frame(name=c("michel","nadia","carole"),
                 cities=c("Paris,Montreal","Chicago,Denver","Beijing,Bankok"))

... и я хотел бы получить вектор (например, из первой строки), например:

michel <- c("Paris","Montreal")

Как мы можем сделать это в R?

Спасибо!

Мишель

Ответы [ 3 ]

2 голосов
/ 26 марта 2020

Мы можем использовать split в list именованных векторов и использовать list2env для создания нескольких объектов в глобальной среде (не рекомендуется)

list2env(split(as.character(df$cities), df$name), envir = .GlobalEnv)

Если нам нужно отделить ' city ​​'

library(dplyr)
library(tidyr)
df %>%
    separate_rows(cities) %>% 
    {split(as.character(.$cities), .$name)} %>%
     list2env(.GlobalEnv)

и теперь проверьте ls() для объектов' name ', созданных в глобальном env


Или другой вариант - извлечь элементы в list, затем преобразуйте его в именованный список с помощью deframe и используйте list2env

library(purrr)
library(tibble)
library(stringr)
df %>% 
     mutate(cities = str_extract_all(cities, "\\w+")) %>% 
     deframe %>%
     list2env(.GlobalEnv)

Или для отдельной строки

assign(as.character(df$name)[1], 
      scan(text = as.character(df$cities)[1], what = "", sep=","))

Теперь проверьте ls() и объект 'michel' будет найден

michel
#[1] "Paris"    "Montreal"
1 голос
/ 26 марта 2020

Стоит отметить, что у фреймов данных в R могут быть столбцы списка, поэтому вы можете просто преобразовать столбец cities в список векторов. Таким образом, все по-прежнему организовано аккуратно в data.frame, и вы можете получить доступ к векторам для указанных c имен путем подстановки фрейма данных

df$cities <- strsplit(as.character(df$cities), ',')

df
#     name          cities
# 1 michel Paris, Montreal
# 2  nadia Chicago, Denver
# 3 carole Beijing, Bankok

df$cities[[which(df$name == 'michel')]]
# [1] "Paris"    "Montreal"
1 голос
/ 26 марта 2020

Сначала мы разбиваем названия городов на векторы:

cities <- strsplit(as.character(df$cities), ",")

И мы присваиваем элементам списка имена и используем list2env() для копирования каждой записи в глобальную среду:

names(cities) <- df$name
list2env(cities, envir = .GlobalEnv)

Результатом являются векторы, содержащие названия городов в отдельных записях для каждого имени:

> michel
[1] "Paris"    "Montreal"
> nadia
[1] "Chicago" "Denver" 
> carole
[1] "Beijing" "Bankok" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...