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
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? –
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? –
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 đề –