Я хочу работать с 4 национальными футбольными командами (Англия, Бельгия, Германия и Франция) и n свиданий

Date        Matches
16.03       England X Brazil
16.03       Belgium X Argentina
16.03       Chile X Japan
16.03       Uruguay X Germany
16.03       Italy x France
17.03       South Korea X India
17.03       Germany X France
17.03       Poland  X Belgium
17.03       Colombia X Russia
18.03       South Africa X Mexico
18.03       China X Japon
18.03       Brazil X Venezuela
...          ...

ЖЕЛАЕМЫЕ ДАННЫЕ с манекенами. Когда dummy = 1 команда играла. Когда dummy = 0 команда не играла (в течение дня). Важно: только одна дата в строке.

Date   Dummy_england   Dummy_belgium    Dummy_germany    Dummy_France
16.03  1               1                1                1
17.03  0               1                1                1
18.03  0               0                0                0

Большое спасибо!!

r
2
Fernanda 12 Июн 2021 в 23:03

2 ответа

Лучший ответ

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

  1. Извлеките выбранную команду из каждой строки «совпадений» с помощью str_extract
  2. Оставить только те строки, где есть совпадения, т.е. строки NA удаляются с помощью filter
  3. Используйте pivot_wider, чтобы изменить форму с длинного на "широкое" после {{X1 }} в интересующих столбцах - укажите values_fn как length и values_fill как 0, чтобы изменить значение по умолчанию NA на 0
library(dplyr)
library(tidyr)
library(stringr)
df1 %>%
   mutate(team = str_c('Dummy_', str_extract(Matches, 
       regex('England|Belgium|Germany|France', ignore_case = TRUE)))) %>%
   filter(complete.cases(team)) %>%
   select(-Matches) %>%
   pivot_wider(names_from = team, values_from = team,  
          values_fn = length, values_fill = 0)

-вывод

# A tibble: 2 x 5
   Date Dummy_England Dummy_Belgium Dummy_Germany Dummy_France
  <dbl>         <int>         <int>         <int>        <int>
1  16.0             1             1             1            1
2  17.0             0             1             1            0

Если мы хотим сохранить "Дата" там, где нет совпадений, используйте complete

df1 %>%
   mutate(team = str_c('Dummy_', str_extract(Matches, 
    regex('England|Belgium|Germany|France', ignore_case = TRUE)))) %>%
   filter(complete.cases(team)) %>%
   select(-Matches) %>%
   pivot_wider(names_from = team, values_from = team, 
        values_fn = length, values_fill = 0) %>% 
   complete(Date = unique(df1$Date), fill = list(Dummy_England = 0,
         Dummy_Belgium = 0, Dummy_Germany = 0, Dummy_France = 0))

-вывод

# A tibble: 3 x 5
   Date Dummy_England Dummy_Belgium Dummy_Germany Dummy_France
  <dbl>         <dbl>         <dbl>         <dbl>        <dbl>
1  16.0             1             1             1            1
2  17.0             0             1             1            0
3  18.0             0             0             0            0

Данные

df1 <- structure(list(Date = c(16.03, 16.03, 16.03, 16.03, 16.03, 17.03, 
17.03, 17.03, 17.03, 18.03, 18.03, 18.03), Matches = c("England X Brazil", 
"Belgium X Argentina", "Chile X Japan", "Uruguay X Germany", 
"Italy x France", "South Korea X India", "Germany X France", 
"Poland  X Belgium", "Colombia X Russia", "South Africa X Mexico", 
"China X Japon", "Brazil X Venezuela")), class = "data.frame", row.names = c(NA, 
-12L))
1
akrun 12 Июн 2021 в 20:26
Dummy_england <- tapply(Matches, Date, function(x) {
                      grepl("England", paste(x, collapse = ''))*1
                })
1
Ronak Shah 13 Июн 2021 в 03:19