R применить значения к столбцу, ближайшему к списку в цикле - PullRequest
1 голос
/ 06 марта 2020

Я хочу создать новый столбец, в котором я назначаю значение, наиболее близкое к значениям списка, на основе другого столбца. Это мои данные:

df <- data.frame(AV=c("A", "A", "A", "A", "A", "B", "B", "B", "B"), 
                 var=c( 0.1, 0.2, 1.5, 1.8, 8, 1, 1.4, 13, 3))

x <- c(0.5, 1, 2, 5, 10, 20, 40, 80)


for (i in df$var){
  res <- x[which.min(abs(x - i))]
  print(res)}

[1] 0.5
[1] 0.5
[1] 1
[1] 1
[1] 10
[1] 1
[1] 1
[1] 10
[1] 2

Однако я хочу, чтобы res был новым столбцом в моем фрейме данных и боролся за его реализацию.

  1. Этот подход не работать, потому что он не перебирает каждую строку, я думаю?
f = function(x){x[which.min(abs(x - i))]}

for (i in df$var){
    df$res <- apply(df, 1, f)
}

Включение столбца в l oop тоже не сработало:
f = function(x){x[which.min(abs(x - i))]}

for (i in df$var_floor){
  for (j in df$var_floor){
    df$res <- apply(df, 1, f)
}

#Leads to: Error in x - i : non-numeric argument to binary operator 
Я пытался сделать это с apply:
f = function(x){x[which.min(abs(x - i))]}

for (i in df$var){
    res <- apply(df, 1, f)
}


#Leads to: Error in x - i : non-numeric argument to binary operator 

Применение без for loop тоже не сработало.

Как назначить ближайшее значение для каждого строка

Ответы [ 2 ]

3 голосов
/ 06 марта 2020

Мы можем использовать sapply:

df$res <- sapply(df$var, FUN = function(v) x[which.min(abs(x - v))])

#   AV var  res
# 1  A 0.1  0.5
# 2  A 0.2  0.5
# 3  A 1.5  1.0
# 4  A 1.8  2.0
# 5  A 8.0 10.0
# 6  B 1.0  1.0
# ...
1 голос
/ 06 марта 2020

Один вариант: findInterval из base R

transform(df, res = x[findInterval(var, x)+1])
...