Существует ли функция R, которая может заменить номинальные значения для определенных числовых значений в определенном диапазоне в кадре данных

#r #dataframe #function #matrix #operation

Вопрос:

ниже приведен фрейм данных

 A B C A 0 3 1.1 B 3.1 0 .9 C 2 2.1 0  

И ключ к ценностям ниже

 Label Num w 0 x 1 y 2 z 3  

как создать вывод

 A B C A w z x B z w x C y y w  

Комментарии:

1. Пожалуйста, покажите, что вы пробовали до сих пор и где вам немного не хватает. Это, как говорится, я думаю, что вы ищете cut .

Ответ №1:

data.table подход

 library(data.table) #make them data.tables, keep rownames setDT(df, keep.rownames = "id") setDT(df2) # melt to long format df.melt lt;- melt(df, id.vars = "id", variable.name = "id2", variable.factor = FALSE) # perform rolling join df.melt[, new_value := df2[df.melt, Label, on = .(Num = value), roll = Inf]] # cast to wide again dcast(df.melt, id ~ id2, value.var = "new_value")   id A B C 1: A w z x 2: B z w w 3: C y y w  

примеры данных

 df lt;- read.table(text = " A B C A 0 3 1.1 B 3.1 0 .9 C 2 2.1 0", header = TRUE)  df2 lt;- read.table(text = "Label Num w 0 x 1 y 2 z 3", header = TRUE)  

Ответ №2:

Подход Dplyr :

 library(dplyr) library(tidyr)  df lt;- tibble(rownames=c("A", "B", "C"),  A=c(0, 3.1, 2),  B=c(3,0,2.1),  C=c(1.1, 0.9, 0))  df2 lt;- tibble(label = c("w", "x", "y", "z"),  values = c(0,1,2,3))  df%gt;%mutate(across(A:C, round, digit=0)) %gt;%  pivot_longer(-1, names_to="colnames", values_to=("values")) %gt;%  left_join(df2) %gt;%  select(1,2,4) %gt;%   pivot_wider(., 1:3, names_from="colnames", values_from="label")  # A tibble: 3 x 4  rownames A B C   lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; 1 A w z x  2 B z w x  3 C y y w   

Сначала используйте поперек, чтобы округлить все значения, затем pivot_longer, чтобы получить «длинный» формат, в котором вы можете соединить две таблицы по значениям. Выберите, чтобы удалить столбец, содержащий числа, затем последний указатель поворота, чтобы вернуться к исходному формату.