tidyverse
решение:
data %>%
rowid_to_column() %>%
gather(var, val, -c(x3, rowid)) %>%
mutate(temp = x3 - val) %>%
group_by(rowid) %>%
filter(abs(temp) == min(abs(temp))) %>%
ungroup() %>%
select(val)
val
<dbl>
1 24
2 30
3 20
Во-первых, он добавляет идентификатор строки. Во-вторых, он преобразует данные из широких в длинные. В-третьих, он вычисляет разницу между «x3» и другими переменными. Наконец, он группируется по идентификатору строки и сохраняет строки, абсолютная разница в которых наименьшая.
Or:
data %>%
rowid_to_column() %>%
gather(var, val, -c(x3, rowid)) %>%
mutate(temp = x3 - val) %>%
group_by(rowid) %>%
filter(abs(temp) == min(abs(temp))) %>%
ungroup() %>%
pull(val)
[1] 24 30 20
Или используя подход, изначально предложенный @markus (предполагается, что ваши столбцы названы "x"):
data %>%
mutate(temp = paste0("x", max.col(-abs(.[, -3] - .[, 3])))) %>%
rowwise() %>%
summarise(val = eval(as.symbol(temp)))
val
<dbl>
1 24.
2 30.
3 20.
Во-первых, он оценивает индекс столбца переменной, где абсолютная разница в отношении «x3» является наименьшей, и объединяет ее с «x». Затем он оценивает комбинацию x и индекса столбца как переменную и возвращает соответствующее значение.
Также заимствуя идею из @markus (не предполагая, что ваши столбцы названы "x"):
data %>%
mutate(temp = max.col(-abs(.[, -3] - .[, 3]))) %>%
rowwise %>%
mutate(temp = names(.)[[temp]]) %>%
summarise(val = eval(as.symbol(temp)))
Во-первых, он оценивает индекс столбца переменной, где абсолютная разница в отношении «x3» наименьшая. Во-вторых, он возвращает имя столбца на основе индекса столбца. Наконец, он оценивает его как переменную и возвращает соответствующее значение.
Или вариант, в котором вы можете ссылаться на переменную "x3" по ее имени, а не по индексу столбца (основная идея все еще от @markus):
data %>%
mutate(temp = max.col(-abs(.[, !grepl("x3", colnames(.))] - .[, grepl("x3", colnames(.))]))) %>%
rowwise %>%
mutate(temp = names(.)[[temp]]) %>%
summarise(val = eval(as.symbol(temp)))
person
tmfmnk
schedule
23.01.2019