2015-05-02 3 views
0

У меня есть dataframe с именами У меня есть вторая датафрейм со словарем имен и пола этих имен Я хочу проверить, указано ли это имя в словаре, если это тогда добавить секс из словаря таблицы, имена dataframeR Обновление столбца фрейма данных

Мой код выглядит ниже

# Sets everything to -1, 1 for male, 0 for female 
train$sex <- "-1" 
train$sex[toupper(train$fname) == nam_dict$Name]<-nam_dict$Sex 

Я получаю следующее сообщение об ошибке

Error in train$sex[toupper(train$fname) == nam_dict$Name] <- nam_dict$Sex : 
NAs are not allowed in subscripted assignments 
In addition: Warning message: 
In toupper(train$fname) == nam_dict$Name : 
longer object length is not a multiple of shorter object length 

У меня есть работа вокруг - я думаю - где я могу разделить словарь на мужскую и женскую и просто заменить < -nam_dict $ Sex часть кода с символом «F» или «M» в зависимости от словарь

Я просто думал, что будет лучшим способом

+1

Прежде всего, его не ясно, если '' train' и nam_dict' того же размера, но даже если бы они были, вы Подмените 'поезд $ sex' по условию и вставляя 'nam_dict $ Sex' в него без подмножества. Кроме того, сообщение «NAs не разрешено в индексированных присвоениях» обычно означает, что ваша операция подмножества вернула «NA's и R» не уверен, куда она должна вставлять данные. В любом случае, это не воспроизводится, поскольку у нас нет обоих наборов данных, поэтому я сомневаюсь, что кто-то может вам помочь. –

+0

Привет, Дэвид, поезд и nam_dict - разные размеры. Словарь можно получить из ссылки [здесь] (http://www.autohotkey.com/board/topic/20260-gender-verification-by-forename-cmd-line-tool-db/). Я взял файл nam_dict.txt из него. Набор данных поезда можно получить из [здесь] (https://www.ssb.no/en/befolkning/statistikker/navn/aar/2015-01-27?fane=tabell&sort=nummer&tabell=215662). Его из центрального статистического управления в Норвегии –

+2

Я, конечно, не собираюсь загружать эти наборы данных (кто-то, возможно, будет). Я могу помочь, если вы предоставите [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). Я также думаю, что в процессе создания этого примера вы поймете, что не так с вашим кодом. Желаю вам удачи в любом случае. –

ответ

1

Так что ваша проблема может быть решена с помощью быстрой и простой реализации match. Во-первых, вот быстрый воспроизводимый пример

(train <- data.frame(fname = c("Alex", "Jennifer", "David", "Alice"))) 
#  fname 
# 1  Alex 
# 2 Jennifer 
# 3 David 
# 4 Alice 
(nam_dict <- data.frame(Name = c("alice", "alex"), Sex = 0:1)) 
# Name Sex 
# 1 alice 0 
# 2 alex 1 

Возможное решение

train$sex <- nam_dict$Sex[match(tolower(train$fname), tolower(nam_dict$Name))] 
train 
#  fname sex 
# 1  Alex 1 
# 2 Jennifer NA 
# 3 David NA 
# 4 Alice 0 

Al укусил более продвинутое решение (если you''ll когда-либо работать с огромными наборами данных), чтобы попытаться data.table s двоичное соединение, которое позволяет вам обновлять данные по ссылке, выбрал, какие столбцы обновлять, пока все сделано с молниеносной скоростью.

Сначала мы преобразуем оба набора данных для data.table класса и сделать оба колонн в нижнем регистр, то мы key их в колонке мы хотим соединим, наконец, мы левые присоединиться к train при создании sex колонок по ссылке и потянув данные из i (Sex столбец nam_dict)

library(data.table) 
setDT(train)[, fname := tolower(fname)] 
setDT(nam_dict)[, Name := tolower(Name)] 
setkey(train, fname) ; setkey(nam_dict, Name) 
train[nam_dict, sex := i.Sex] 
train 
#  fname sex 
# 1:  alex 1 
# 2: alice 0 
# 3: david NA 
# 4: jennifer NA 
+1

Извините за задержку в возвращении к вам - Timezones - это именно то, что я искал. Благодарим вас за ответ и особенно за огромные наборы данных (следующий шаг). Я также отметил пример повторного создания метода и теперь буду использовать этот метод, задавая вопросы –

+0

Np, рад, что это сработало для вас. –

Смежные вопросы