Если вы хотите избежать изменения ваших данных, что не всегда просто в этом формате, вы можете использовать функции _at
в dplyr
. Ключевая вещь, которую нужно знать о mutate_at
, что, на мой взгляд, не слишком очевидно, - это то, что вы можете использовать его для создания новых столбцов с согласованным стилем именования. Таким образом, мы можем сделать:
Используйте mutate_at
, чтобы усечь столбцы pa
, если у женщин было более 7 детей. Это в основном означает: сделать эту функцию, которая заменяет значения больше 7 на 7 в каждом столбце, который начинается с «pa». Синтаксис ~
представляет собой компактный способ описания временной функции в purrr
и dplyr
.
Используйте mutate_at
снова, но на этот раз с функцией в качестве именованного элемента списка и с функцией, которая создает функцию с правильными уровнями и метками. Имя будет добавлено к исходным именам столбцов с разделителем подчеркивания. Обратите внимание, что мы можем использовать str_c
, чтобы не вводить каждый уровень вручную.
Мы хотим, чтобы столбцы читали 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>
Ваши последние работы предложения, но можно также избегать использования jcl.Buffer
:
Set(javaApi.query(...).toArray: _*)
Отметьте это scala.collection.immutable.Set
сделан доступным по умолчанию благодаря Predef.scala
.
Вы могли преобразовать набор Java в массив и затем создать список Scala из этого:
val array = java.util.Arrays.asList("one","two","three").toArray
val list = List.fromArray(array)
Вы можете добавить информацию о типе в вызов toArray, чтобы сделать Set параметризованным:
val s = Set(javaApi.query(....).toArray(new Array[String](0)) : _*)
Это может быть предпочтительнее, поскольку пакет коллекций подвергается серьезной переработке для Scala 2.8, а пакет scala.collection.jcl - уходит
Вы также можете изучить эту прекрасную библиотеку: 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