2016-05-29 2 views
1

У меня есть два массиваДвумерное нанесение в R?

chemArr = c("water","oil",...(lots of values omitted)...,"hydrogen") 
timeArr = c("0", "8hr", "12hr", "24hr", "36hr", "48hr", "72hr") 

, и я хотел бы построить кадр данных

chem 0    8hr    ... 72hr 
water f("water", "0") f("water", "8hr") ... 
... 

где f функция я написал. Есть ли хороший способ сделать это в R?

В моем конкретном случае было бы более эффективно выполнять функцию, принимающую chem, и возвращать столбец за каждый раз, поскольку каждая из этих общих вычислений. Но поскольку требуемое общее время невелико, я мог бы сделать это по-другому, если это более удобно.

+4

Попробуйте 'mapply' см' mapply' – coffeinjunky

+1

ааа, не видел, что второй из них является 'е («вода»,«8 ч»)' в отличие от 'е (» масло "," 8 часов "). В этом случае предложение akrun 'outer', вероятно, лучше или построение с использованием' rep («chemArr», length («timeArr»)) 'in' mapply'. – coffeinjunky

+2

Я удалил свой предыдущий комментарий, думая, что я ошибся. Моим оригинальным комментарием было использование 'outer'. то есть 'external (timeArr, chemArr, FUN = f)' – akrun

ответ

3

я предлагаю использовать expand.grid, что создает «длинную форму» все комбинации 2-полосные, а затем использовать mapply для создания значения из функция:

chemArr = c("water","oil","hydrogen") 
timeArr = c("0", "8hr", "12hr", "24hr", "36hr", "48hr", "72hr") 
mygrid <- expand.grid(chemArr, timeArr) 
mygrid <- expand.grid(chems = chemArr, times = timeArr) 
str(mygrid) 
#'data.frame': 21 obs. of 2 variables: 
# $ chems: Factor w/ 3 levels "water","oil",..: 1 2 3 1 2 3 1 2 3 1 ... 
# $ times: Factor w/ 7 levels "0","8hr","12hr",..: 1 1 1 2 2 2 3 3 3 4 ... 
# - attr(*, "out.attrs")=List of 2 
# ..$ dim  : Named int 3 7 
# .. ..- attr(*, "names")= chr "chems" "times" 
# ..$ dimnames:List of 2 
# .. ..$ chems: chr "chems=water" "chems=oil" "chems=hydrogen" 
# .. ..$ times: chr "times=0" "times=8hr" "times=12hr" "times=24hr" ... 

mygrid$f_value <- mapply(f, mygrid$chems, mygrid$times) 
+0

О, возможно. Первая версия привела результат с именами столбцов Var1 и Var2, и мне нужны более значимые имена. –

3

Чтобы проиллюстрировать обсуждаемое в комментариях решения:

one <- letters[1:3] 
two <- letters[4:6] 

one 
[1] "a" "b" "c" 
two 
[1] "d" "e" "f" 

mapply(paste0, one, two) 
    a b c 
"ad" "be" "cf" 

mapply(paste0, sort(rep(one, length(two))), two) 
    a a a b b b c c c 
"ad" "ae" "af" "bd" "be" "bf" "cd" "ce" "cf" 

mapply(paste0, one, list(two)) # courtesy of @thelatemail 
    a b c 
[1,] "ad" "bd" "cd" 
[2,] "ae" "be" "ce" 
[3,] "af" "bf" "cf" 

outer(one, two, paste0) # courtesy of @akrun 
    [,1] [,2] [,3] 
[1,] "ad" "ae" "af" 
[2,] "bd" "be" "bf" 
[3,] "cd" "ce" "cf" 
+0

'rep' не требуется в' mapply' - 'mapply (paste0, one, list (two))' например. – thelatemail

+0

Еще раз спасибо @thelatemail Я обновил решение. – coffeinjunky

Смежные вопросы