2012-06-08 3 views
1

Я хотел бы выбрать в моем dataframe (catch) только строки, для которых моя переменная «tspp.name» совпадает с моей переменной «elasmo.name».Выбор строк с одинаковым результатом в разных столбцах в R

Например, строки # 74807 и # 74809 в этом случае будут выбраны, но не строки # 74823, потому что elasmo.name - это «skate», а tspp.name - «Северные креветки».

Я уверен, что для этого есть простой ответ, но я еще не нашел его. Любые намеки будут оценены.

> catch[4:6,] 
     gear tripID obsID sortie setID  date  time NAFO lat long  dur depth bodymesh 
74807 GRL2 G00001  A  1 13 2000-01-04 13:40:00 2H 562550 594350 2.000000 377  80 
74809 GRL2 G00001  A  1 14 2000-01-04 23:30:00 2H 562550 594350 2.166667 370  80 
74823 GRL2 G00001  A  1 16 2000-01-05 07:45:00 2H 561450 593050 3.000000 408  80 
     codendmesh mail.fil long.fil nbr.fil hook.shape hook.size hooks VTS tspp  tspp.name elasmo 
74807   45  NA  NA  NA     NA NA 3.3 2211 Northern shrimp 2211 
74809   45  NA  NA  NA     NA NA 3.2 2211 Northern shrimp 2211 
74823   45  NA  NA  NA     NA NA 3.3 2211 Northern shrimp 211 
      elasmo.name kept discard Tcatch  date.1 latitude longitude  EID 
74807 Northern shrimp 2747  50 2797 2000-01-04 56.91667 -60.21667 G00001-13 
74809 Northern shrimp 4919  100 5019 2000-01-04 56.91667 -60.21667 G00001-14 
74823   Skates 0  50  50 2000-01-05 56.73333 -60.00000 G00001-16 
           fgear 
74807 Shrimp trawl (stern) with a grid 
74809 Shrimp trawl (stern) with a grid 
74823 Shrimp trawl (stern) with a grid 
+0

ли 'поймать [с (приловом, tspp.name == elasmo.name)]' делать то, что вы хотите? – Justin

+2

или 'catch [which (catch $ tspp.name == catch $ elasmo.name),]' –

+0

или 'catch [catch $ tspp.name == catch $ elasmo.name,]' в этом отношении. – Justin

ответ

2

Я знаю, что эта проблема - вам нужно прочитать в данных «как есть», добавив аргумент as.is=TRUE к read.csv команде (которые вы, вероятно, используемой для загрузки все в). Без этого, строки откладываются в качестве факторов, и все методы, предложенные выше не получится (как вы обнаружили!)

После того, как вы читали в данных правильно, вы можете использовать либо

catch[which(catch$tspp.name == catch$elasmo.name),] 

или

subset(catch, tspp.name == elasmo.name) 

для получения соответствующих строк - не опускать which в первом в противном случае код потерпит неудачу при выполнении сравнений НСБА.

Ниже приведен пример из 30-ти секунд с использованием небольшого сфабрикованного набора данных, который явно иллюстрирует все эти точки.

Во-первых, создать текстовый файл на диске, который выглядит следующим образом (я сохранил его как «F: /test.dat», но он может быть сохранен в любом месте) ...

col1~col2 
a~b 
a~a 
b~b 
c~NA 
NA~d 
NA~NA 

Давайте загрузить его в без преобразования факторов в строки, просто чтобы увидеть предложенные методы выше опрокинуться:

> dat=read.csv("F:/test.dat",sep="~") # don't forget to check the filename 

> dat[which(dat$col1==dat$col2),] 
Error in Ops.factor(dat$col1, dat$col2) : level sets of factors are different 

> dat[dat$col1==dat$col2,] 
Error in Ops.factor(dat$col1, dat$col2) : level sets of factors are different 

> subset(dat,col1==col2) 
Error in Ops.factor(col1, col2) : level sets of factors are different 

Это именно проблема вы имеете. Если вы наберете dat$col1 и dat$col2, вы увидите, что первый имеет уровни факторов a b c, а второй - уровни факторов a b d - следовательно, сообщения об ошибках.

Теперь давайте сделаем то же самое, но на этот раз чтение в данных «как есть»:

> dat=read.csv("F:/test.dat",sep="~",as.is=TRUE) # note the as.is=TRUE 

> dat[which(dat$col1==dat$col2),] 
    col1 col2 
2 a a 
3 b b 

> dat[dat$col1==dat$col2,] 
    col1 col2 
2  a a 
3  b b 
NA <NA> <NA> 
NA.1 <NA> <NA> 
NA.2 <NA> <NA> 

> subset(dat,col1==col2) 
    col1 col2 
2 a a 
3 b b 

Как вы можете видеть, первый метод (основанный на which) и третий метод (на основе subset) оба дают правильный ответ, а второй метод путается сравнением с NA. Я лично защищал бы метод subset, поскольку, на мой взгляд, он самый опрятный.

Заключительное примечание. Существуют другие способы, с помощью которых вы можете получить строки, возникающие как факторы в кадре данных, и чтобы избежать всех этих головных болей, всегда помните, что нужно включать аргумент stringsAsFactors = FALSE в конце всякий раз, когда вы создаете фрейм данных, используя data.frame. Например, правильный способ создать объект dat непосредственно в R будет:

dat=data.frame(col1=c("a","a","b","c",NA,NA), col2=c("b","a","b",NA,"d",NA), 
         stringsAsFactors=FALSE) 

Тип dat$col1 и dat$col2, и вы увидите, что они были правильно интерпретированы.Если вы повторите попытку, но с аргументом stringsAsFactors, опущенным (или установленным в TRUE), вы увидите, как появляются эти проклятые факторы (как и хитроумный первый способ загрузки с диска).

Короче говоря, всегда помните as.is=TRUE и stringsAsFactors=FALSE, и узнайте, как использовать команду subset, и вы не ошибетесь!

Надеется, что это помогает :)

+0

Фантастический ответ @TimP благодарит вас за все ваши подробности. – GodinA

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