Заполните переменную, когда другая переменная содержит определенную символьную строку (R dataframe) - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь создать наблюдение на основе наблюдения из другой переменной, содержащей определенный символ.Я пробовал следующий код:

site<-  c('5.1',    'CD 1.1',   'FD 1', 'FD 2', 'FD 3', 'FD 4',  
'FD 5', 'FD 6')
year<-  c(2011, 2013,   2010,   2010,   2010,   2010,   2010,   2010)
diveLocation<-  NA

df = data.frame(site, year, diveLocation)
df$diveLocation<-as.character(df$diveLocation)
df$diveLocation<- gsub("^C\\w+", "compliance", df$site)

head(df)

, который дает:

    site    year  diveLocation                           
1   5.1   2011    5.1   
2   CD 1.1  2013    compliance 1.1  
3   FD 1    2010    FD 1    
4   FD 2    2010    FD 2    
5   FD 3    2010    FD 3    
6   FD 4    2010    FD 4

единственный положительный момент состоит в том, что соответствие заполнило "diveLocation", однако мне нужен только символ соответствия (т.е.не с наблюдением «site» 1.1), и я не хочу, чтобы все другие наблюдения «site» попадали в «diveLocation» (например, 5.1 и т. д.), а просто заполнялись NA.Любой совет будет очень признателен!

Ответы [ 3 ]

0 голосов
/ 26 декабря 2018

Мы можем использовать grep для создания числового индекса.Подмножество 'site' основано на индексе, присвойте значения соответствующим элементам 'diveLocation'

i1 <- grep("^CD", df$site)
df$diveLocation[i1] <-  'compliance'
df
#    site year   diveLocation
#1    5.1 2011           <NA>
#2 CD 1.1 2013    compliance
#3   FD 1 2010           <NA>
#4   FD 2 2010           <NA>
#5   FD 3 2010           <NA>
#6   FD 4 2010           <NA>
#7   FD 5 2010           <NA>
#8   FD 6 2010           <NA>
i2 <- grep("^FD", df$site)
df$diveLocation[i2] <- 'Farm'

или используя data.table

library(data.table)
setDT(df)[grep("^CD", site), diveLocation := 'compliance'][]
0 голосов
/ 26 декабря 2018

Использование пакетов tidyverse и комбинации case_when и str_detect

library(tidyverse)

site<-  c('5.1',    'CD 1.1',   'FD 1', 'FD 2', 'FD 3', 'FD 4',  
          'FD 5', 'FD 6')
year<-  c(2011, 2013,   2010,   2010,   2010,   2010,   2010,   2010)
diveLocation<-  NA


df = data.frame(site, year, diveLocation) %>%as_tibble()


new_df <- df %>%
    mutate(diveLocation = case_when(
        str_detect(site,pattern = "C") ~ "compliance",
        str_detect(site, pattern = "F") ~"farm",
        TRUE ~ NA_character_
    ))

new_df
0 голосов
/ 26 декабря 2018

Этот код должен сделать всю работу за вас.

site<-  c('5.1',    'CD 1.1',   'FD 1', 'FD 2', 'FD 3', 'FD 4',  
          'FD 5', 'FD 6')
year<-  c(2011, 2013,   2010,   2010,   2010,   2010,   2010,   2010)
diveLocation<-  NA

df = data.frame(site, year, diveLocation)

df$diveLocation <- ifelse(substr(df$site, 1, 1) == "C", "compliance", ifelse(substr(df$site, 1, 1) == "F", "Farm","NA"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...