Проблема с несколькими условиями в R, которая не работает - PullRequest
0 голосов
/ 31 августа 2018

У меня проблема с несколькими условиями в R. Мои данные таковы:

Region in UK     Year        Third column (year.city) 
Liverpool        2008           
Manchester       2010
Liverpool        2016
Chester          2015
Birmingham       2016
Blackpool        2012
Birmingham       2005
Chester          2009
Liverpool        2005
Hull             2011
Leeds            2013
Liverpool        2014
Bradford         2008
London           2010
Coventry         2009
Cardiff          2016 
Liverpool        2007

То, что я хочу создать, - это третий столбец, который он имеет для групп в нем: Ливерпуль до 2010 года, Ливерпуль после 2010 года, Другие города до 2010 года, другие города после 2010 года. Я пробовал пару кодов, таких как мутировать, но мог не решить это. Можете ли вы помочь мне сделать это? Спасибо

Ответы [ 4 ]

0 голосов
/ 31 августа 2018

Я думаю, что проще всего использовать векторизацию с базой R:

# create index of categories
vec <- c("Other cities after 2010", "Liverpool after 2010", "Other cities before 2010", "Liverpool before 2010")
# create index vector
ix <- 1 + (df$Region.in.UK == "Liverpool") + 2*(df$Year < 2010)

# index the categories-vector with the index-vector
df$year.city <- vec[ix]

Результат:

> df
   Region.in.UK Year                year.city
1     Liverpool 2008    Liverpool before 2010
2    Manchester 2010  Other cities after 2010
3     Liverpool 2016     Liverpool after 2010
4       Chester 2015  Other cities after 2010
5    Birmingham 2016  Other cities after 2010
6     Blackpool 2012  Other cities after 2010
7    Birmingham 2005 Other cities before 2010
8       Chester 2009 Other cities before 2010
9     Liverpool 2005    Liverpool before 2010
10         Hull 2011  Other cities after 2010
11        Leeds 2013  Other cities after 2010
12    Liverpool 2014     Liverpool after 2010
13     Bradford 2008 Other cities before 2010
14       London 2010  Other cities after 2010
15     Coventry 2009 Other cities before 2010
16      Cardiff 2016  Other cities after 2010
17    Liverpool 2007    Liverpool before 2010
0 голосов
/ 31 августа 2018

Я бы сделал это, как предложил @dvibisan, и использовал бы dplyr.

# Create a dataframe
df <- structure(list(`Region in UK` = c("Liverpool", "Manchester", "Liverpool", 
                                        "Chester", "Birmingham", "Blackpool", "Birmingham", "Chester", 
                                        "Liverpool", "Hull", "Leeds", "Liverpool", "Bradford", "London", 
                                        "Coventry", "Cardiff", "Liverpool"), 
                     Year = c(2008L, 2010L, 2016L, 2015L, 2016L, 2012L, 2005L, 2009L, 2005L, 2011L, 2013L, 2014L, 2008L, 2010L, 2009L, 2016L, 2007L)), 
                row.names = c(NA, -17L), class = c("data.table", "data.frame"))

# Load the dplyr library to use mutate and if_else (if there were more than 2 conditions of interest for each variable could use case_when)
library(dplyr) 

# Create a new column using mutate, pasting together two conditions
df <-
  df %>% 
  mutate(`Third column (year.city)` = paste0(if_else(grepl("Liverpool", `Region in UK`, fixed = TRUE), `Region in UK`, "Other cities"),
                                             if_else(Year < 2010, " before 2010", " 2010 or after")))
0 голосов
/ 31 августа 2018

Используя базу R, вы можете сделать:

 transform(df, year.city = factor(paste(sub('^((?!Liver).)*$', 'other', Region_in_UK,perl = TRUE), Year>2010), label=1:4))

   Region_in_UK Year year.city
1     Liverpool 2008         1
2    Manchester 2010         3
3     Liverpool 2016         2
4       Chester 2015         4
5    Birmingham 2016         4
6     Blackpool 2012         4
7    Birmingham 2005         3
8       Chester 2009         3
9     Liverpool 2005         1
10         Hull 2011         4
11        Leeds 2013         4
12    Liverpool 2014         2
13     Bradford 2008         3
14       London 2010         3
15     Coventry 2009         3
16      Cardiff 2016         4
17    Liverpool 2007         1

Вы также можете сделать:

transform(df,m=factor(paste(!grepl("Liverpool",Region_in_UK),Year>2010),label=1:4))

или

transform(df,m = factor(paste(sub('(Liverpool)|.*','\\1',Region_in_UK),Year<=2010),label=4:1))
   Region_in_UK Year m
1     Liverpool 2008 1
2    Manchester 2010 3
3     Liverpool 2016 2
4       Chester 2015 4
5    Birmingham 2016 4
6     Blackpool 2012 4
7    Birmingham 2005 3
8       Chester 2009 3
9     Liverpool 2005 1
10         Hull 2011 4
11        Leeds 2013 4
12    Liverpool 2014 2
13     Bradford 2008 3
14       London 2010 3
15     Coventry 2009 3
16      Cardiff 2016 4
17    Liverpool 2007 1
0 голосов
/ 31 августа 2018

Попробуйте это

Region_in_UK = c( "Liverpool", "Manchester", "Liverpool", "Chester", 
"Birmingham", "Blackpool", "Birmingham", "Chester", "Liverpool", "Hull", 
"Leeds", "Liverpool", "Bradford", "London", "Coventry", "Cardiff", "Liverpool")
Year = c(2008, 2010, 2016, 2015, 2016, 2012, 2005, 2009, 2005, 2011, 2013,
2014, 2008, 2010, 2009, 2016, 2007)
df = data.frame(Region_in_UK, Year)

# erase the code above and replace your own dataframe if its bigger 
# than the data you displayed at this point and name it "df" (e.g.: 
# df = your_dataframe)

df$year_city = rep(NA, dim(df)[1])
df = mutate(df, year_city = 
              ifelse (grepl("Liverpool", df$Region_in_UK) &  df$Year < 2010, 
                      "Liverpool before 2010", df$year_city))
df = mutate(df, year_city = 
              ifelse (grepl("Liverpool", df$Region_in_UK) &  df$Year >= 2010, 
                      "Liverpool 2010 and after", df$year_city))
df = mutate(df, year_city = 
              ifelse (!grepl("Liverpool", df$Region_in_UK) &  df$Year < 2010, 
                      "Other before 2010", df$year_city))
df = mutate(df, year_city = 
              ifelse (!grepl("Liverpool", df$Region_in_UK) &  df$Year >= 2010, 
                      "Other 2010 and after", df$year_city))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...