我想使用數字向量過濾資料框。我正在應用以下功能:
test_data <- exp_data[exp_data$Size_Change %in% vec_data,]
這就是示例資料的樣子:
dput(exp_data)
structure(list(Name = c("Mark", "Greg", "Tomas", "Morka", "Pekka",
"Robert", "Tim", "Tom", "Bobby", "Terka"), Mode = c(1, 2, NA,
4, NA, 3, NA, 1, NA, 3), Change = structure(c(6L, 2L, 4L, 5L,
7L, 7L, 7L, 8L, 3L, 1L), .Label = c("D[ 58], I[ 12][ 385]", "C[ 58], K[ 1206]",
"C[ 58], P[ 2074]", "C[ 58], K[ 2172]", "C[ 58], K[ 259]", "C[ 58], K[ 2665]",
"C[ 58], T[ 385]", "C[ 58], C[ 600]"), class = "factor"), Size = c(1335.261,
697.356, 1251.603, 920.43, 492.236, 393.991, 492.239, 727.696,
1218.933, 495.237), Place = c(3L, 4L, 3L, 2L, 4L, 5L, 4L, 3L,
3L, 4L), Size_Change = c(4004, 2786, 3753, 1840, 1966, 1966,
1966, 2181, 3655, 1978)), row.names = 2049:2058, class = "data.frame")
和用于過濾的向量:
dput(vec_data)
c(4003, 2785, 954, 1129, 4013, 756, 1852, 2424, 1954, 246, 147,
234, 562, 1617, 2180, 888, 1176)
我提到了容差,因為vec_data它不是很精確,我期望數字有 1/-1 的差異,并且在應用函式后,它不會過濾具有這種差異的行。也可能發生差異為 12/-12 或 24/-24。我可以在過濾時以某種方式考慮它嗎?
當然,可能的解決方案是這樣做 (vec_data 1) / (vec_data -1) / (vec_data 12) 等,并進行幾次過濾嘗試,也許最終 rbind 輸出所有但我正在尋找更多“優雅”的方式。如果可以添加一列來指示該行是如何過濾的,如果它是一個確切的數字,vec_data或者它被 1、 12、-24 或其他任何東西修改,那也會很棒。請注意, 1/-1 與任何其他修改的組合也是可能的。如果它太復雜,則不需要額外的列。
uj5u.com熱心網友回復:
一種選擇可能是(容差 = 1):
df %>%
filter(sapply(Size_Change, function(x) any(abs(x - vec) %in% 0:1)))
Name Mode Change Size Place Size_Change
1 Mark 1 C[ 58], K[ 2665] 1335.261 3 4004
2 Greg 2 C[ 58], K[ 1206] 697.356 4 2786
3 Tom 1 C[ 58], C[ 600] 727.696 3 2181
公差 = 14:
df %>%
filter(sapply(Size_Change, function(x) any(abs(x - vec) %in% 0:14)))
Name Mode Change Size Place Size_Change
1 Mark 1 C[ 58], K[ 2665] 1335.261 3 4004
2 Greg 2 C[ 58], K[ 1206] 697.356 4 2786
3 Morka 4 C[ 58], K[ 259] 920.430 2 1840
4 Pekka NA C[ 58], T[ 385] 492.236 4 1966
5 Robert 3 C[ 58], T[ 385] 393.991 5 1966
6 Tim NA C[ 58], T[ 385] 492.239 4 1966
7 Tom 1 C[ 58], C[ 600] 727.696 3 2181
相同的邏輯rowwise():
df %>%
rowwise() %>%
filter(any(abs(Size_Change - vec) %in% 0:1))
uj5u.com熱心網友回復:
最明顯的方法是基于不等式而不是精確匹配進行過濾(在比較數字 [不是整數] 時總是推薦)
comp <- function(x, yvec, tolerance = 1){
sapply(x, \(xi){any(abs(xi - yvec) <= tolerance)})
}
exp_data[comp(exp_data$Size_Change, vec_data),]
Name Mode Change Size Place Size_Change
2049 Mark 1 C[ 58], K[ 2665] 1335.261 3 4004
2050 Greg 2 C[ 58], K[ 1206] 697.356 4 2786
2056 Tom 1 C[ 58], C[ 600] 727.696 3 2181
# Tolerance = 2
# exp_data[comp(exp_data$Size_Change, vec_data, 2),]
uj5u.com熱心網友回復:
使用tolerance 函式怎么樣。
tol <- \(x, tol=1L) sapply(seq(-tol, tol, 1L), \(i) sweep(as.matrix(x), 1L, i))
exp_data[exp_data$Size_Change %in% tol(vec_data), ]
# Name Mode Change Size Place Size_Change
# 2049 Mark 1 C[ 58], K[ 2665] 1335.261 3 4004
# 2050 Greg 2 C[ 58], K[ 1206] 697.356 4 2786
# 2056 Tom 1 C[ 58], C[ 600] 727.696 3 2181
它默認為公差±1,如果我們想要±24,我們可以在引數中定義它:
exp_data[exp_data$Size_Change %in% tol(vec_data, 24L), ]
# Name Mode Change Size Place Size_Change
# 2049 Mark 1 C[ 58], K[ 2665] 1335.261 3 4004
# 2050 Greg 2 C[ 58], K[ 1206] 697.356 4 2786
# 2052 Morka 4 C[ 58], K[ 259] 920.430 2 1840
# 2053 Pekka NA C[ 58], T[ 385] 492.236 4 1966
# 2054 Robert 3 C[ 58], T[ 385] 393.991 5 1966
# 2055 Tim NA C[ 58], T[ 385] 492.239 4 1966
# 2056 Tom 1 C[ 58], C[ 600] 727.696 3 2181
# 2058 Terka 3 D[ 58], I[ 12][ 385] 495.237 4 1978
我想知道Lin 24L,它是整數表示法,您也可以tol=24毫無問題地使用。
注: R 版本 4.1.2 (2021-11-01)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/388493.html
標籤:r
