Я знаю, что эта проблема - вам нужно прочитать в данных «как есть», добавив аргумент 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
, и вы не ошибетесь!
Надеется, что это помогает :)
ли 'поймать [с (приловом, tspp.name == elasmo.name)]' делать то, что вы хотите? – Justin
или 'catch [which (catch $ tspp.name == catch $ elasmo.name),]' –
или 'catch [catch $ tspp.name == catch $ elasmo.name,]' в этом отношении. – Justin