Преобразование набора Java в набор Scala

Если вы хотите избежать изменения ваших данных, что не всегда просто в этом формате, вы можете использовать функции _at в dplyr. Ключевая вещь, которую нужно знать о mutate_at, что, на мой взгляд, не слишком очевидно, - это то, что вы можете использовать его для создания новых столбцов с согласованным стилем именования. Таким образом, мы можем сделать:

  1. Используйте mutate_at, чтобы усечь столбцы pa, если у женщин было более 7 детей. Это в основном означает: сделать эту функцию, которая заменяет значения больше 7 на 7 в каждом столбце, который начинается с «pa». Синтаксис ~ представляет собой компактный способ описания временной функции в purrr и dplyr.

  2. Используйте mutate_at снова, но на этот раз с функцией в качестве именованного элемента списка и с функцией, которая создает функцию с правильными уровнями и метками. Имя будет добавлено к исходным именам столбцов с разделителем подчеркивания. Обратите внимание, что мы можем использовать str_c, чтобы не вводить каждый уровень вручную.

  3. Мы хотим, чтобы столбцы читали ppa вместо этого суффикса, поэтому мы можем использовать rename_at, чтобы переименовать их все. Сначала мы удалим суффикс, а затем добавим p в начало.

П.С. В конечном итоге вам может оказаться легче «привести в порядок» ваши данные, чтобы каждая строка представляла собой год женщины, а не женщину.

library(tidyverse)

pa2010 <- c(0, 0, 2, 5, 3, 6, 8, 2, 1, 1)
pa2009 <- c(0, 0, 2, 4, 3, 6, 8 ,2, 0, 0)
pa2008 <- c(0, 0, 1, 4, 3, 5, 8, 1, 0, 0)

Parity <- data.frame(pa2010, pa2009, pa2008)
Parity %>%
  mutate_at(
    .vars = vars(starts_with("pa")),
    .funs = ~ if_else(. >= 7, 7, .)
  ) %>%
  mutate_at(
    .vars = vars(starts_with("pa")),
    .funs = list(
      parity = ~ . %>%
        factor(levels = 0:7, labels = str_c("Parity ", 0:7)) %>%
        fct_recode("Parity 7+" = "Parity 7")
    )
  ) %>%
  rename_at(
    .vars = vars(ends_with("_parity")),
    .funs = . %>%
      str_remove("_parity") %>%
      str_c("p", .)
  )
#>    pa2010 pa2009 pa2008   ppa2010   ppa2009   ppa2008
#> 1       0      0      0  Parity 0  Parity 0  Parity 0
#> 2       0      0      0  Parity 0  Parity 0  Parity 0
#> 3       2      2      1  Parity 2  Parity 2  Parity 1
#> 4       5      4      4  Parity 5  Parity 4  Parity 4
#> 5       3      3      3  Parity 3  Parity 3  Parity 3
#> 6       6      6      5  Parity 6  Parity 6  Parity 5
#> 7       7      7      7 Parity 7+ Parity 7+ Parity 7+
#> 8       2      2      1  Parity 2  Parity 2  Parity 1
#> 9       1      0      0  Parity 1  Parity 0  Parity 0
#> 10      1      0      0  Parity 1  Parity 0  Parity 0

Создано в 2019-03-22 с помощью пакета представитель (v0.2.1) sup>

86
задан Community 23 May 2017 в 12:32
поделиться

4 ответа

Ваши последние работы предложения, но можно также избегать использования jcl.Buffer:

Set(javaApi.query(...).toArray: _*)

Отметьте это scala.collection.immutable.Set сделан доступным по умолчанию благодаря Predef.scala.

16
ответ дан Erik Kaplun 24 November 2019 в 07:57
поделиться

Вы могли преобразовать набор Java в массив и затем создать список Scala из этого:

val array = java.util.Arrays.asList("one","two","three").toArray
val list = List.fromArray(array)
1
ответ дан Fabian Steeg 24 November 2019 в 07:57
поделиться

Вы можете добавить информацию о типе в вызов toArray, чтобы сделать Set параметризованным:

 val s = Set(javaApi.query(....).toArray(new Array[String](0)) : _*)

Это может быть предпочтительнее, поскольку пакет коллекций подвергается серьезной переработке для Scala 2.8, а пакет scala.collection.jcl - уходит

2
ответ дан 24 November 2019 в 07:57
поделиться

Вы также можете изучить эту прекрасную библиотеку: scalaj-collection , которая имеет двустороннее преобразование между коллекциями Java и Scala. В вашем случае, чтобы преобразовать java.util.List в Scala List, вы можете сделать это:

val list = new java.util.ArrayList[java.lang.String]
list.add("A")
list.add("B")
list.asScala
14
ответ дан 24 November 2019 в 07:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: