我有一个有两个基本条件的数据集,我试图根据它们在数据框中的位置来匹配这些值。这是一个例子:
Row Cond Y
1 n 350
2 n 354
3 t 375
4 n 300
5 n 157
6 t 810
7 n 214
8 n 243
9 n 345
10 n 216
11 n 198
12 t 870
我希望匹配" n"的每个值。附近有一个" t" (即,在彼此的5行内)。然后,我想减去" n"的值。来自" t"。在上面的示例中,我们的第1行将与第3行匹配,并且我们的值为25(375 - 350)。如果行在两个" t"之间是等距的。行,我想默认为早期" t"排,如果可能的话。理想情况下,我会在适当的情况下创建一个具有这些差异分数的新向量,以便" NA"或" 0"对于带有" t"的行显示条件。所以这看起来像:
Result
25
21
NA
75
653
NA
596
567
465
654
672
NA
有没有办法在R中实现这个?我已根据标准尝试了一些子集(例如,""或" =="),但我想知道我是否在我以错误的方式接近它!任何见解将不胜感激! :)
答案 0 :(得分:0)
getclosest <- function(df, i) {
if (as.character(df$Cond[[i]]) == "t") {
return (NA)
} else {
# df$Y[i]
below <- NA
above <- NA
aj <- NA
bj <- NA
for (j in 1:5) {
pos <- i - j
if (pos < 1) break
if (df$Cond[pos] == "t") {
below <- df$Y[pos]
bj <- j
break
}
}
for (j in 1:5) {
pos <- i + j
if (pos > nrow(df)) break
if (df$Cond[pos] == "t") {
above <- df$Y[pos]
aj <- j
break
}
}
temp = NA
tempb = NA
if (is.na(above) && is.na(below)) {
return(NA)
}
if (!is.na(below) && !is.na(above)) {
if (aj < bj) {
return(abs(above - df$Y[i]))
} else {
return(abs(below - df$Y[i]))
}
}
if (!is.na(below)) {
tempb <- abs(below - df$Y[i])
return (tempb)
}
if (!is.na(above)) {
tempa <- abs(above - df$Y[i])
return(tempa)
}
return (NA)
}
}
df <- data.frame(Cond=c('n', 'n', 't','n','n','t','n','n','n','n','n','t'), Y=c(350,354,375,300,157,810,214,243,345,216,198,870))
v <- c() # length=nrow(df))
for (i in 1:nrow(df)) {
v[i] <- getclosest(df, i)
}