Цикл и сравнение вектора и фрейма данных (в R) - PullRequest
0 голосов
/ 02 ноября 2018

Rhrhrjrjdjxjxjdiebejejdjdjddhdbdbd dbdbdbbddb

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Если вы знакомы с dplyr, вы можете сделать это с помощью mutate.

instru = c("Accordian", "Clarinet", "Trumpet", "DoubleBass", "Oboe", "Piano", "Saxophone", "Violin", "Cello", "Tuba", "Viola",
           "Bassoon", "EnglishHorn", "French horn", "Flute", "Piccolo", "SynthBass", "Trombone")

mix1_instruments = c("Accordion", "Trumpet", "Violin", "Cello", "Triangle")
mix2_instruments = c("Bassoon", "Saxophone", "Flute", "French horn", "Washboard")

train = data.frame(mix1_instruments, mix2_instruments)

train <- train %>%
  mutate(instruments = (mix1_instruments %in% instru) | (mix2_instruments %in% instru))

Выходы TRUE или FALSE, но они также могут быть преобразованы в 0 или 1.

train$instruments <- as.numeric(train$instruments)

Редактировать: только что увидел, что меня вычерпали, когда я писал свой ответ (гораздо лучше!), Но есть проблема с масштабируемостью.

Далее будут вставлены новые столбцы с именем <old_column_name>_instruments с логическими значениями, если каждая запись в этом столбце находится в инструкции, а затем объединить их в один столбец, содержащий логическое значение для любого значения в any . столбец содержал запись в инструкции:

instru = c("Accordian", "Clarinet", "Trumpet", "DoubleBass", "Oboe", "Piano", "Saxophone", "Violin", "Cello", "Tuba", "Viola",
           "Bassoon", "EnglishHorn", "French horn", "Flute", "Piccolo", "SynthBass", "Trombone")

mix1_instruments = c("Clarinet", "Flute", "Clarinet", "English Horn", "Washboard", "Saxophone", "Washboard")
mix2_instruments = c("French Horn", "French Horn", "French Horn", "Flute", "Flute", "Triangle", "Triangle")

train = data.frame(mix1_instruments, mix2_instruments)

train %<>%
  mutate_all(funs(instruments = . %in% instru)) %>%
  unite(col = instruments,
        ends_with('_instruments_instruments'), # optional, iterates only over columns added by unite in this particular dataset
        remove=T) %>%
  mutate(instruments = as.numeric(grepl('TRUE', instruments)))

Выход:

train
#  mix1_instruments mix2_instruments instruments
#1         Clarinet      French Horn           1
#2            Flute      French Horn           1
#3         Clarinet      French Horn           1
#4     English Horn            Flute           1
#5        Washboard            Flute           1
#6        Saxophone         Triangle           1
#7        Washboard         Triangle           0

Примечание: %<>% от magrittr и просто заменяет синтаксис x <- x %>% ...

Вы можете вывести фрейм данных с функциями write.x , чтобы вывести его в виде csv:

write.csv(train, "/path/to/dir/filename.csv", row.names=F)
0 голосов
/ 02 ноября 2018

Если я правильно понял ваш вопрос, вы можете пропустить цикл for, так как R работает с векторной безопасностью в вашем списке инструментов. Используя tidyverse ваш код может выглядеть так:

# load tidyverse
library(tidyverse)

# set vector of instruments
instru = c("Accordian", "Clarinet", "Trumpet", "DoubleBass", "Oboe", "Piano", "Saxophone", "Violin", "Cello", "Tuba", "Viola", "Bassoon", "EnglishHorn", "French horn", "Flute", "Piccolo", "SynthBass", "Trombone")

# create dummy train data.frame (more exactly a "tibble")
train <- tibble(mix1_instrument = c("a", "b", "Clarinet"),
                mix2_instrument = c("a", "Clarinet", "c"),
                xxx = c("Clarinet", "b", "c"))

#> train
## A tibble: 3 x 3
#mix1_instrument mix2_instrument xxx     
#<chr>           <chr>           <chr>   
#1 a               a               Clarinet
#2 b               Clarinet        b       
#3 Clarinet        c               c       


# add column "instruments" to train
train <- train %>% 
  mutate(instruments = case_when(
    mix1_instrument %in% instru ~ "1",
    mix2_instrument %in% instru ~ "1",
    TRUE ~"0"
  ))

#>     train
## A tibble: 3 x 4
# mix1_instrument mix2_instrument xxx      instruments
# <chr>           <chr>           <chr>    <chr>      
#1 a               a               Clarinet 0          
#2 b               Clarinet        b        1          
#3 Clarinet        c               c        1       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...