Расположите строки в произвольном порядке, используя R - PullRequest
0 голосов
/ 07 февраля 2020

Мне нужно заказать df по стране в соответствии с порядком target_cc уровней. Как мне этого добиться? Смотри MWE


country <- rep(c("AT","BE","CY","DE","EE"),10)
value <- seq(1, 50)

target_cc <- data.frame("DE","CY","BE","AT","EE")


df <- data.frame(country, value)
df

Ответы [ 4 ]

2 голосов
/ 07 февраля 2020

Лучший способ сделать это - сделать вашу переменную country равной factor с уровнями в нужном вам порядке. Тогда на нем будет работать любое стандартное решение для сортировки / заказа:

# First, it's weird that target_cc is a data frame with these columns
# I'm hoping that was a typo in your question, and we can use it as a
# vector instead. If not, we can create the vector from the data frame
# with unlist():

target_cc
#  X.DE. X.CY. X.BE. X.AT. X.EE.
#1    DE    CY    BE    AT    EE

# useless as data frame, useful as vector
target_cc_v = unlist(target_cc)
# or fix the definition
target_cc_v = c("DE","CY","BE","AT","EE")


# Make country a factor with the levels in this order:
df$country = factor(df$country, levels = target_cc_v)

# Any standard sort/order solution should now work
df[order(df$country, df$value), ]
#    country value
# 4       DE     4
# 9       DE     9
# 14      DE    14
# 19      DE    19
# 24      DE    24
# 29      DE    29
# 34      DE    34
# 39      DE    39
# 44      DE    44
# 49      DE    49
# 3       CY     3
# 8       CY     8
# ...
0 голосов
/ 07 февраля 2020

Вы можете сделать country заказным фактором.

library(dplyr)

country <- rep(c("AT","BE","CY","DE","EE"),10)
value <- seq(1, 50)

# chenged this to a vector rather than a data frame
target_cc <- c("DE","CY","BE","AT","EE")

df %>% 
  mutate(country = factor(country, levels = target_cc)) %>% 
  arrange(country)
0 голосов
/ 07 февраля 2020

Базовое решение R с использованием order

dfout <- df[order(match(df$country,unlist(target_cc))),]

, что дает

> dfout
   country value
4       DE     4
9       DE     9
14      DE    14
19      DE    19
24      DE    24
29      DE    29
34      DE    34
39      DE    39
44      DE    44
49      DE    49
3       CY     3
8       CY     8
13      CY    13
18      CY    18
23      CY    23
28      CY    28
33      CY    33
38      CY    38
43      CY    43
48      CY    48
2       BE     2
7       BE     7
12      BE    12
17      BE    17
22      BE    22
27      BE    27
32      BE    32
37      BE    37
42      BE    42
47      BE    47
1       AT     1
6       AT     6
11      AT    11
16      AT    16
21      AT    21
26      AT    26
31      AT    31
36      AT    36
41      AT    41
46      AT    46
5       EE     5
10      EE    10
15      EE    15
20      EE    20
25      EE    25
30      EE    30
35      EE    35
40      EE    40
45      EE    45
50      EE    50
0 голосов
/ 07 февраля 2020

Я не уверен, правильно ли я понимаю ваш запрос, поэтому, пожалуйста, дайте мне знать, если это не то, что вы ищете.

Вы можете использовать target_ cc, чтобы присоединиться к df, но она должна быть той же длины, что и df.

Использование dplyr:

library(dplyr)

country <- rep(c("AT","BE","CY","DE","EE"), 10)

value <- seq(1, 50)

df <- data.frame(country, value)

target <- data.frame(
  country = rep(c("DE","CY","BE","AT","EE"), times = 5)
)

df2 <- df %>%
  right_join(target, by = "country") %>%
  distinct()

head(df2)
#>   country value
#> 1      DE     4
#> 2      DE     9
#> 3      DE    14
#> 4      DE    19
#> 5      DE    24
#> 6      DE    29

tail(df2)
#>    country value
#> 45      EE    25
#> 46      EE    30
#> 47      EE    35
#> 48      EE    40
#> 49      EE    45
#> 50      EE    50

Создано в 2020-02-07 пакетом Представить (v0.3.0)

Поскольку это приведет к перекрестному произведению, используйте distinct, чтобы сохранить только уникальные строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...