-3
    dput(x)
structure(list(Date = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 
3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L), .Label = c("1/1/2012", 
"2/1/2012", "3/1/2012", "4/1/2012", "5/1/2012", "6/1/2012"), class = "factor"), 
    Continent = structure(c(3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
    3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L), .Label = c("Asia", "Europe", 
    "South America"), class = "factor"), Score = c(10L, 4L, 9L, 
    1L, 9L, 3L, 10L, 0L, 0L, 10L, 4L, 9L, 10L, 4L, 9L, 0L, 0L, 
    5L), Country = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
    3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("Brasil", 
    "China", "Germany"), class = "factor"), mean = c(6.83333333333333, 
    3.5, 5.83333333333333, 6.83333333333333, 3.5, 5.83333333333333, 
    6.83333333333333, 3.5, 5.83333333333333, 6.83333333333333, 
    3.5, 5.83333333333333, 6.83333333333333, 3.5, 5.83333333333333, 
    6.83333333333333, 3.5, 5.83333333333333), sd = c(4.91596040125088, 
    3.33166624979154, 3.81663027639129, 4.91596040125088, 3.33166624979154, 
    3.81663027639129, 4.91596040125088, 3.33166624979154, 3.81663027639129, 
    4.91596040125088, 3.33166624979154, 3.81663027639129, 4.91596040125088, 
    3.33166624979154, 3.81663027639129, 4.91596040125088, 3.33166624979154, 
    3.81663027639129), outlier1 = c(FALSE, FALSE, FALSE, TRUE, 
    TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, 
    FALSE, FALSE, TRUE, TRUE, FALSE)), .Names = c("Date", "Continent", 
"Score", "Country", "mean", "sd", "outlier1"), row.names = c(NA, 
-18L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x0000000005e70788>)

我计算了每个国家的平均值、标准差和异常值1。我想对每个国家/地区应用 outlier_score 来对它们进行排名。有人可以指点如何计算该数据集的异常值分数吗?

4

1 回答 1

2
# if the record is an outlier,
# take the absolute value of the difference
# between the score and the mean
# otherwise leave it blank
x$distance.to.mean <- ifelse( x$outlier1 , abs( x$Score - x$mean ) , NA )

# for all records with non-missing distances,
# add a `rank` variable based on its order in the data
x[ !is.na( x$distance.to.mean ) , 'rank' ] <- 
    rank( x[ !is.na( x$distance.to.mean ) , 'distance.to.mean' ] )

# see the result
x

# sum up the number of outliers in each country grouping
outliers.by.country <- tapply( x$outlier1 , x$Country , sum )

# take a look at those counts
outliers.by.country

# create a vector of all matches to the outliers.by.country table
y <- match( x$Country , names( outliers.by.country ) )

# and merge on the contents of the outliers.by.country table to x
x$sum.outliers <- 
    outliers.by.country[ y ]

# sort by the sum if you like
x <- x[ order( x$sum.outliers , decreasing = TRUE ) , ]
于 2013-01-23T20:06:28.390 回答