Я пытаюсь заменить значения в кадре данных значениями из таблицы.Как использовать apply() в сочетании с match() в R?
df <- read.table(text=" v1 v3_1 v3_3 v3_4 v3_5 v4_1 v4_3 v4_4 v4_5
11 0 0 0 0 0 0 0 0
12 0 0 0 0 0 0 0 0
13 0 0 0 0 0 0 0 0
14 0 0 0 0 0 0 0 0
15 0 0 0 0 0 0 0 0
21 0 0 0 0 0 0 0 0
22 0 0 0 0 0 0 0 0
23 0 0 0 0 0 0 0 0
24 0 0 0 0 0 0 0 0
25 0 0 0 0 0 0 0 0 ", header=T)
table <- read.table(text=" v1 v3 v4
11 0.419774852 0.646429258
13 0.396813214 0.922897052
14 0.874210969 0.022308197
15 0.997159373 0.234000934
21 0.062226556 0.171017067
23 0.467930927 0.273295148
24 0.318980872 0.17997447
25 0.323878792 0.026514599 ", header=T)
Переменная table$v3
предполагается заменить значения переменных df$v3_1
к df$v3_5
. Переменная table$v4
должна заменять значения в переменных df$v4_1
на df$v4_5
.
Проблема в том, что я не могу понять, как это сделать в одной команде apply
. По состоянию на сейчас, я должен использовать две команды: apply
cols1 <- c("v3_1", "v3_3", "v3_4", "v3_5")
cols2 <- c("v4_1", "v4_3", "v4_4", "v4_5")
df[,cols1] <- apply(df[,cols1], 2, function(x) table[match(df$v1, table$v1), "v3"])
df[,cols2] <- apply(df[,cols2], 2, function(x) table[match(df$v1, table$v1), "v4"])
Есть ли способ сделать это с помощью одной команды apply
? Я пытался что-то вроде:
cols3 <- c("v3_1", "v3_3", "v3_4", "v3_5", "v4_1", "v4_3", "v4_4", "v4_5")
df[,cols3] <- apply(df[,cols3], 2, function(x) table[match(df$v1, table$v1), c("v3", "v4")])
Но это только создает v3
и v4
переменные для каждого cols3
переменных.
@joelwilson. Я пытаюсь заставить ваш примерный код работать с моими фактическими данными (т. Е. Не приведенными выше примерами). Я не делаю много процесса, и я думаю, что проблема в том, что мои таблицы действительно находятся в списке. Все таблицы имеют одинаковые размеры. Кроме того, в моих фактических данных 'df' имеет гораздо больше переменных, чем те, которые я пытаюсь заменить значениями, и они находятся в середине кадра данных. Поэтому я пытаюсь использовать 'lapply':' New.DFs <- lapply (table.list, function (table) {cbind (df [1], lapply (colnames (таблица [-1]), func))}) '. – RTrain3k
и это работало @ RTrain3k? –
Он работает, хотя и не с моими фактическими данными, потому что столбцы, которые я пытаюсь заменить значениями, находятся в середине кадра данных. – RTrain3k