I have have the below data :
Y z
100-800 a
150-600 b
200-300 c
400-600 d
4000-12000 e
どんな助けでも本当にありがたいです。
与えられたxの値(つまりx = 100)に基づいて、与えられたYの範囲の値を見つけ、対応するYとzの値を与える必要があります。与えられたxが与えられたYの範囲にない場合は、より近い範囲で、YとZの対応する値を示します。
DT [、list(OK = 1%in%seq(Y、Y))、by = Z]
X = 110の与えられた値に対して
出力は
Y Z
100-800 a
For x=200
Y z
100-800 a
150-600 b
200-300 c
For x=12500
Y z
4000-12000 e
tidyr::separate
列を区切るためにを使用してヘルパー関数を記述できます。範囲内のインデックスがないvalue
場合は、データフレーム内の最小値と最大値を比較し、それに応じて行を返します。
subset_fun <- function(df, val) {
df1 <- tidyr::separate(df, Y, c("low", "high"), sep = "-",convert = TRUE)
inds <- with(df1, val >= low & val <= high)
if (any(inds))
df[inds, ]
else if (min(df1$low) > val) df[which.min(df1$low), ]
else df[which.max(df1$high), ]
}
subset_fun(df, 100)
# Y z
#1 100-800 a
subset_fun(df, 200)
# Y z
#1 100-800 a
#2 150-600 b
#3 200-300 c
subset_fun(df, 12500)
# Y z
#5 4000-12000 e
subset_fun(df, 0)
# Y z
#1 100-800 a
データ
df <- structure(list(Y = structure(1:5, .Label = c("100-800", "150-600",
"200-300", "400-600", "4000-12000"), class = "factor"),
z = structure(1:5, .Label = c("a", "b", "c", "d", "e"), class = "factor")),
class = "data.frame", row.names = c(NA, -5L))
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加