2015-04-15 20 views
6

Tôi có một dataframe như sau:Chỉ bao gồm giá trị ngoại biên từ mỗi cột trong một dataframe

chr leftPos   TBGGT  12_try  324Gtt  AMN2 
    1  24352   34   43   19   43 
    1  53534   2   1   -1   -9 
    2  34   -15   7   -9   -18 
    3  3443   -100  -4   4   -9 
    3  3445   -100  -1   6   -1 
    3  3667   5   -5   9   5 
    3  7882   -8   -9   1   3 

tôi phải tạo ra một vòng lặp đó:

a) Tính giới hạn trên và dưới (UL và LL) cho mỗi cột từ cột thứ ba trở đi.
b) Chỉ bao gồm các hàng rơi bên ngoài của UL và LL (Zoutliers).
c) Sau đó đếm số hàng mà Zoutlier có cùng hướng (tức là dương hoặc âm) như trước hoặc hàng tiếp theo cho cùng một số. do đó

Kết quả sẽ là:

ZScore1 TBGGT  12_try  324Gtt  AMN2 
nrow  4   6   4   4 

Cho đến nay tôi có mã như sau:

library(data.table)#v1.9.5 
    f1 <- function(df, ZCol){ 

    #A) Determine the UL and LL and then generate the Zoutliers 
    UL = median(ZCol, na.rm = TRUE) + alpha*IQR(ZCol, na.rm = TRUE) 
    LL = median(ZCol, na.rm = TRUE) - alpha*IQR(ZCol, na.rm = TRUE) 
    Zoutliers <- which(ZCol > UL | ZCol < LL) 

    #B) Exclude Zoutliers per chr if same direction as previous or subsequent row 
    na.omit(as.data.table(df)[, {tmp = sign(eval(as.name(ZCol))) 
    .SD[tmp==shift(tmp) | tmp==shift(tmp, type='lead')]}, 
    by=chr])[, list(.N)]} 

    nm1 <- paste0(names(df) 
    setnames(do.call(cbind,lapply(nm1, function(x) f1(df, x))), nm1)[] 

Mã này được vá lại với nhau từ những nơi khác nhau. Vấn đề tôi có là kết hợp các bộ phận A) và B) của mã để có được đầu ra Tôi muốn

+0

Có phải 'Zcol' về cơ bản là' 3: ncol (df) ', tức là tất cả các cột từ số 3 trở đi hoặc chỉ một cột tại một thời điểm? –

+0

Nó sẽ tính toán nó một cột tại một thời điểm. Tôi đoán đầu ra của phần đầu tiên của mã nên cung cấp cho tôi tất cả các ngoại lệ Z với chr và leftPos mà chúng tôi đang nghĩ đến. Phần thứ hai sau đó sẽ lấy cột đó và cho mỗi chr sau đó đánh giá từng hàng như mô tả. Đó là ý tưởng. Vậy tôi có nên vượt qua Zoutliers đến phần thứ hai không? –

+0

Nếu tôi chỉ tập trung vào phần đầu tiên, tôi sẽ nhận được các Zoutliers bằng chr và leftPos như thế nào sau đó tôi có thể chuyển đến phần thứ hai của vấn đề –

Trả lời

0

Bạn có thể thử chức năng này không? Tôi không chắc chắn những gì alpha là, vì vậy tôi không thể sao chép sản lượng dự kiến ​​và bao gồm nó như là biến trong chức năng.

# read your data per copy&paste 
d <- read.table("clipboard",header = T) 
# or as in Frank comment mentioned solution via fread 
d <- data.table::fread("chr leftPos   TBGGT  12_try  324Gtt  AMN2 
            1  24352   34   43   19   43 
            1  53534   2   1   -1   -9 
            2  34   -15   7   -9   -18 
            3  3443   -100  -4   4   -9 
            3  3445   -100  -1   6   -1 
            3  3667   5   -5   9   5 
            3  7882   -8   -9   1   3") 


# set up the function 
foo <- function(x, alpha, chr){ 
    # your code for task a) and b) 
    UL = median(x, na.rm = TRUE) + alpha*IQR(x, na.rm = TRUE) 
    LL = median(x, na.rm = TRUE) - alpha*IQR(x, na.rm = TRUE) 
    Zoutliers <- which(x > UL | x < LL) 
    # part (c 
    # factor which specifies the direction. 0 values are set as positives 
    pos_neg <- ifelse(x[Zoutliers] >= 0, "positive", "negative") 
    # count the occurrence per chromosome and direction. 
    aggregate(x[Zoutliers], list(chr[Zoutliers], pos_neg), length) 
} 

# apply over the columns and get a list of dataframes with number of outliers per chr and direction. 
apply(d[,3:ncol(d)], 2, foo, 0.95, d$chr) 
+1

Fyi, gói bây giờ cung cấp chức năng 'fread' mà bạn có thể sử dụng đọc trong văn bản như 'DT = fread (" văn bản văn bản ")' – Frank

+0

@Frank Ồ, tốt để biết. Bao gồm chức năng này trong câu trả lời của tôi. – Jimbou

Các vấn đề liên quan