2017-02-02 8 views
0

Я пытаюсь заменить значения в кадре данных значениями из таблицы.Как использовать 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 переменных.

ответ

0

, если вы хорошо с lapply: (более лучшие способы возможны, хотя)

func <- function(x){ 
    l = grepl(x, colnames(df)) # create logical vec of which columns needs to be replaced 
    df[df$v1 %in% table[[1]] ,l]=table[x] # substitute where l is TRUE 
    df[l]         # return only the replaced column 
} 
cbind(df[1], lapply(colnames(table[-1]), func)) 
+0

@joelwilson. Я пытаюсь заставить ваш примерный код работать с моими фактическими данными (т. Е. Не приведенными выше примерами). Я не делаю много процесса, и я думаю, что проблема в том, что мои таблицы действительно находятся в списке. Все таблицы имеют одинаковые размеры. Кроме того, в моих фактических данных 'df' имеет гораздо больше переменных, чем те, которые я пытаюсь заменить значениями, и они находятся в середине кадра данных. Поэтому я пытаюсь использовать 'lapply':' New.DFs <- lapply (table.list, function (table) {cbind (df [1], lapply (colnames (таблица [-1]), func))}) '. – RTrain3k

+0

и это работало @ RTrain3k? –

+0

Он работает, хотя и не с моими фактическими данными, потому что столбцы, которые я пытаюсь заменить значениями, находятся в середине кадра данных. – RTrain3k

1

Вы можете сделать:

sapply(colnames(table[-1]),function(x) df[df$v1 %in% table$v1,grepl(x,colnames(df))]<<-table[,x]) 
> df 
    v1  v3_1  v3_3  v3_4  v3_5  v4_1  v4_3  v4_4  v4_5 
1 11 0.41977485 0.41977485 0.41977485 0.41977485 0.6464293 0.6464293 0.6464293 0.6464293 
2 12 0.00000000 0.00000000 0.00000000 0.00000000 0.0000000 0.0000000 0.0000000 0.0000000 
3 13 0.39681321 0.39681321 0.39681321 0.39681321 0.9228971 0.9228971 0.9228971 0.9228971 
4 14 0.87421097 0.87421097 0.87421097 0.87421097 0.0223082 0.0223082 0.0223082 0.0223082 
5 15 0.99715937 0.99715937 0.99715937 0.99715937 0.2340009 0.2340009 0.2340009 0.2340009 
6 21 0.06222656 0.06222656 0.06222656 0.06222656 0.1710171 0.1710171 0.1710171 0.1710171 
7 22 0.00000000 0.00000000 0.00000000 0.00000000 0.0000000 0.0000000 0.0000000 0.0000000 
8 23 0.46793093 0.46793093 0.46793093 0.46793093 0.2732951 0.2732951 0.2732951 0.2732951 
9 24 0.31898087 0.31898087 0.31898087 0.31898087 0.1799745 0.1799745 0.1799745 0.1799745 
10 25 0.32387879 0.32387879 0.32387879 0.32387879 0.0265146 0.0265146 0.0265146 0.0265146 

NB: использование <<- не считается хорошей практикой, как это может быть опасно.

+0

спасибо. Я пытаюсь заставить ваш код экзамена работать над моими фактическими данными (т. Е. Не приведенными выше примерами). Я не делаю много процесса, и я думаю, что проблема в том, что мои таблицы действительно находятся в списке. Поэтому я пытаюсь использовать lapply: 'New.DFs <- lapply (table.list, function (table) {sapply (colnames (таблица [-1]), function (x) df [df $ v1% in% table $ v1, grepl (x, colnames (df))] << - table [, x])}) Также в моих данных df имеет гораздо больше переменных, чем только те, которые я пытаюсь заменить значениями. – RTrain3k

+0

@ RTrain3k, вы имеете в виду, что у вас есть несколько df и table? – Haboryme

+0

Переменные df, перечисленные мной в моем примере выше, являются всего лишь подмножеством фактических переменных в кадре данных. Конечно, меня интересует только замена значений в подмножестве переменных от v3_1 до v4_5. Что касается таблицы, у меня есть список таблиц. – RTrain3k