R: Построение условных комбинаций - PullRequest
1 голос
/ 08 ноября 2019

Я ищу эффективный способ построения на базе данных с несколькими условными комбинациями. Процесс, который я пытаюсь превратить в какую-то гибкую функцию «create-df», работает следующим образом:

# STEP 1
level.1 <- c("Netherlands", "New Zealand", "Europe")

# STEP 2: 
level.1 <- c("Netherlands", "New Zealand", "Europe", "Europe")
level.2 <- c(NA, NA, "London", "Paris")
df <- data.frame(level.1, level.2)
df

# STEP 3:
level.1 <- c("Netherlands", "New Zealand", "Europe", "Europe", "Europe", "Europe")
level.2 <- c(NA, NA, "London", "London", "Paris", "Paris")
level.3 <- c(NA, NA, "City", "Roads", "City", "Roads")
data.frame(level.1, level.2, level.3)

# STEP 4:
level.1 <- c("Netherlands", "New Zealand", "Europe", "Europe", "Europe", "Europe", "Europe", "Europe")
level.2 <- c(NA, NA, "London", "London", "London", "London", "Paris", "Paris")
level.3 <- c(NA, NA, "City", "City", "Roads", "Roads", "City", "Roads")
level.4 <- c(NA, NA, "A-Regulated", "G-Regulated", "A-Regulated", "G-Regulated", NA, NA)
data.frame(level.1, level.2, level.3, level.4)

Часть, которую я хотел бы сделать гибкой, заключается в том, что если я добавлю новуюпеременная для этих столбцов, она будет знать, какое правило следовать. Поэтому, если я добавлю новый уровень к уровню 4 и скажу, что он называется «C-Regulated», который будет соответствовать лондонской группе, это создаст дополнительные две строки для уровня 3, чтобы каждая комбинация была с C-Regulated, как показано ниже. .

level.1 <- c("Netherlands", "New Zealand", "Europe", "Europe", "Europe", "Europe", "Europe", "Europe", "Europe", "Europe")
level.2 <- c(NA, NA, "London", "London", "London", "London", "London", "London", "Paris", "Paris")
level.3 <- c(NA, NA, "City", "City", "City", "Roads", "Roads", "Roads", "City", "Roads")
level.4 <- c(NA, NA, "A-Regulated", "G-Regulated", "C-Regulated", "A-Regulated", "G-Regulated", "C-Regulated", NA, NA)
data.frame(level.1, level.2, level.3, level.4)

Я играл с этим в цикле for и с помощью expand.grid () для создания фреймов данных, но я застрял с мышлением операторов if-else, и Донне хочу просто создавать длинный неэффективный код. Любой совет?

1 Ответ

1 голос
/ 08 ноября 2019

Вы можете сделать это с помощью слияния и уменьшить его до цикла.

На каждом уровне вам нужно будет указать только те значения, к которым вы хотите присоединиться:

level.1 <- data.frame(country = c("Netherlands", "New Zealand", "Europe"))
level.2 <- data.frame(country = c("Europe"), city = c('paris','london' ))
level.3 <- data.frame(country = c('Europe'), location = c('city', 'roads'))
level.4 <- data.frame(country = c('Europe'), regulation = c("A-Regulated", "G-Regulated", "C-Regulated"))

Затем мы используем слияние внутри Reduce, чтобы сделать это рекурсивно:

Reduce(function(x, y) merge(x, y, all=TRUE), list(level.1, level.2, level.3, level.4))

       country   city location  regulation
1       Europe  paris     city A-Regulated
2       Europe  paris     city G-Regulated
3       Europe  paris     city C-Regulated
4       Europe  paris    roads A-Regulated
5       Europe  paris    roads G-Regulated
6       Europe  paris    roads C-Regulated
7       Europe london     city A-Regulated
8       Europe london     city G-Regulated
9       Europe london     city C-Regulated
10      Europe london    roads A-Regulated
11      Europe london    roads G-Regulated
12      Europe london    roads C-Regulated
13 Netherlands   <NA>     <NA>        <NA>
14 New Zealand   <NA>     <NA>        <NA>

Reduce немного сложнее: это то же самое, что выписывать каждое слияние во вложенном виде:

merge(merge(merge(level.1, level.2, all = TRUE), level.3, all = TRUE), level.4, all = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...