#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, чтобы получить «длинный» формат, в котором вы можете соединить две таблицы по значениям. Выберите, чтобы удалить столбец, содержащий числа, затем последний указатель поворота, чтобы вернуться к исходному формату.