Как добавить соответствующее имя файла в качестве нового столбца, используя tidyverse - PullRequest
0 голосов
/ 16 декабря 2018

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

options(stringsAsFactors = FALSE)
games <- data.frame(index = c(1,2,3), player = c('John', 'Sam', 'Mary'))
weather <- data.frame(index = c(1,2,3), temperature = c('hot', 'cold', 'rainy'))
list1 <- list(games = games, weather = weather)

games <- list()
weather <- data.frame(index = c(1,2,3), temperature = c('cold', 'rainy', 'hot'))
cars <- data.frame(index = c(1,2,3), car = c('honda', 'toyota','bmw'))
list2 <- list(games = games, weather = weather, cars = cars)

games <- data.frame(index = c(1,2,3), player = c('Peter', 'Kevin', 'Mary'))
weather <- list()
list3 <- list(games = games, weather = weather)

all_list <- list(list1, list2, list3)
all_names <- all_list %>% map(names) %>% reduce(union)
list(list1, list2, list3) %>%
  transpose(.names = all_names) %>%
  map(dplyr::bind_rows)

Возвращает,

 $`games`
      index player
    1     1   John
    2     2    Sam
    3     3   Mary
    4     1  Peter
    5     2  Kevin
    6     3   Mary

    $weather
      index temperature
    1     1         hot
    2     2        cold
    3     3       rainy
    4     1        cold
    5     2       rainy
    6     3         hot

    $cars
      index    car
    1     1  honda
    2     2 toyota
    3     3    bmw

Допустим, спискиимпортируются из разных файлов, например, list1, list2 и list3 из 1001.csv, 2005.csv и 3009.csv соответственно

Если я хочу добавить столбцы, соответствующие имени файла, чтобы возвращатьбудет выглядеть следующим образом:

$`games`
  index player userid
1     1   John   1001
2     2    Sam   1001
3     3   Mary   1001
4     1  Peter   3009
5     2  Kevin   3009
6     3   Mary   3009

$weather
  index temperature userid
1     1         hot   1001
2     2        cold   1001
3     3       rainy   1001
4     1        cold   2005
5     2       rainy   2005
6     3         hot   2005

$cars
  index    car userid
1     1  honda   2005
2     2 toyota   2005
3     3    bmw   2005

Я пытался использовать, но безуспешно.

  file.nm <- gsub(".csv", "",file.list)
  list(list1, list2, list3) %>% map(function(x) bind_cols(x, file.nm)) %>% 
     transpose(.names = all_names) %>%
     map(dplyr::bind_rows)

, где file.list - вектор, содержащий имя файла (.csv)

Не могли бы вы дать мне предложения?

1 Ответ

0 голосов
/ 16 декабря 2018

У вашего подхода есть пара проблем: x - это список фреймов данных, а не один фрейм данных;file.nm - это вектор имен, а не одно имя;некоторые элементы x могут иметь нулевую длину, и в этих случаях не должно быть привязок.

Мы можем использовать

files.nm <- c("1001", "2005", "3009")
list(list1, list2, list3) %>% 
  map2(files.nm, ~ map(.x[lengths(.x) > 0], cbind, userid = .y)) %>%
  transpose(.names = all_names) %>% map(dplyr::bind_rows)
$games
  index player userid
1     1   John   1001
2     2    Sam   1001
3     3   Mary   1001
4     1  Peter   3009
5     2  Kevin   3009
6     3   Mary   3009

$weather
  index temperature userid
1     1         hot   1001
2     2        cold   1001
3     3       rainy   1001
4     1        cold   2005
5     2       rainy   2005
6     3         hot   2005

$cars
  index    car userid
1     1  honda   2005
2     2 toyota   2005
3     3    bmw   2005
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...