0

私は複数のサイトを持っています - それぞれが複数回訪問しました。各サイトからの 1 回の訪問のみを含むようにデータをサブセット化し (ただし、その訪問からのすべての観察)、その訪問がすべてのサイトへのすべての訪問の中央値の日付に (時間的に) 最も近いようにしたいと考えています。

サンプルデータ:

d = data.table(site = c('a', 'a','a','a','b', 'b','b', 'b', 'c', 'c', 'c', 'c'), 
       sex = c('m','f','m','f','m','f','m','f','m','f','m','f'), 
       date = c(127,127, 185, 185, 132,132, 189,189, 119,119, 178, 178), 
       count = c(12, 15, 10, 9, 18, 22,12, 15, 10, 9, 18, 22)) 

私が取得したいもの:

d = data.table(site = c('a', 'a','b', 'b', 'c', 'c'), 
     sex = c('m','f','m','f','m','f'),
     date = c(127,127, 132,132, 178, 178), 
     count = c(12, 15,18, 22, 18, 22))
4

2 に答える 2

1

これは、ベースRを使用aveしてからの1つのアプローチですrank

myRanks <- with(mydf, ave(date, site, FUN = function(x) 
  rank(abs(x - median(date)), ties.method = "first")))
mydf[myRanks == 1, ]
#   site date count
# 1    a  127    12
# 3    b  132    10
# 6    c  178    22

rank中央値に「最も近い」値が複数ある場合に対処するために使用されます。

于 2013-04-10T20:16:35.603 に答える
1
library(data.table)

d = data.table(site = c('a', 'a', 'b', 'b', 'c', 'c'),
               date = c(127, 185, 132, 189, 119, 178),
               count = c(12, 15, 10, 9, 18, 22))

d.median = d[, median(date)]
d[, {i = which.min(abs(date - d.median));
     list(date = date[i], count = count[i])},
  by = list(sex, site)]
于 2013-04-10T20:09:24.793 に答える