Сначала из ?merge
:
Строки в двух кадрах данных, которые соответствуют указанным столбцам, извлекаются и объединяются вместе. Если есть более одного совпадения, все возможные совпадения вносят по одной строке каждый .
blockquote>Используя вашу ссылку в комментариях:
url <- "http://koeppen-geiger.vu-wien.ac.at/data/KoeppenGeiger.UScounty.txt" koppen <- read.table(url, header=T, sep="\t") nrow(koppen) # [1] 3594 length(unique(koppen$FIPS)) # [1] 2789
Таким образом, четко
koppen
дублирует коды FIPS. Рассматривая набор данных и веб-сайт, кажется, что многие из округов находятся в более чем одном климатическом классе, поэтому, например, в графстве Анкорадж, Аляска имеет три климатических класса:koppen[koppen$FIPS==2020,] # STATE COUNTY FIPS CLS PROP # 73 Alaska Anchorage 2020 Dsc 0.010 # 74 Alaska Anchorage 2020 Dfc 0.961 # 75 Alaska Anchorage 2020 ET 0.029
Решение зависит на то, что вы пытаетесь выполнить. Если вы хотите извлечь все строки в
all
с любымFIPS
, который появляется вkoppen
, любой из них должен работать:merge(all,unique(koppen$FIPS)) all[all$FIPS %in% unique(koppen$FIPS),]
Если вам нужно добавить имя графства и состояния в
all
, используйте это:merge(all,unique(koppen[c("STATE","COUNTY","FIPS")]),by="FIPS")
EDIT На основе обмена ниже в комментариях.
Итак, поскольку в
koppen
есть несколько строк с тем жеFIPS
, но разныеCLS
, нам нужен способ решить, какую из строк (например, которыеCLS
) выбрать. Вот два способа:# this extracts the row with the largest value of PROP, for that FIPS url <- "http://koeppen-geiger.vu-wien.ac.at/data/KoeppenGeiger.UScounty.txt" koppen <- read.csv(url, header=T, sep="\t") koppen <- with(koppen,koppen[order(FIPS,-PROP),]) sub.koppen <- aggregate(koppen,by=list(koppen$FIPS),head,n=1) result <- merge(all, sub.koppen, by="FIPS") # this extracts a row at random sub.koppen <- aggregate(koppen,by=list(koppen$FIPS), function(x)x[sample(1:length(x),1)]) result <- merge(all, sub.koppen, by="FIPS")
Вы можете использовать DateDiff( ms, '00:00:00', e.Duration )
для преобразования времени в целое число миллисекунд. Используйте это для своей совокупности, а затем преобразуйте результат обратно, например. Cast( DateAdd( ms, 1234, '00:00:00' ) as Time )
.
Дополнение к ответам HABO и Rafi.
Для моего случая мне пришлось указать значение DATEDIFF для bigint, потому что мое значение стало слишком большим и вызвало ошибку арифметического переполнения.
CAST(DATEADD( ms,AVG(CAST(DATEDIFF( ms, '00:00:00', ISNULL(e.Duration, '00:00:00')) as bigint)), '00:00:00' ) as TIME) as 'avg_time'
Ну, похоже, time
является недопустимым типом для метода avg()
. Обратитесь к здесь за список допустимых типов данных.
Кроме того, кажется, что вам нужна группа значений для этого, что отрицает необходимость в top 10
с вашим текущим запросом.
Улучшение ответа HABO:
select top 10
Cast(DateAdd( ms,avg(DateDiff( ms, '00:00:00', e.Duration)), '00:00:00' ) as time) as 'avg duration'
from TimeTable e