2013-03-26 2 views
1

Я пытаюсь применить функцию по всем строкам и столбцам двух фреймов данных, но я не знаю, как ее решить с применением. Я думаю, что следующий сценарий объясняет, что я намереваюсь сделать, и способ, которым я пытался его решить. Любые советы будут высоко оценены! Обратите внимание, что simplefunction предназначен только для удобства использования.Применение ко всем столбцам и строкам двух разных фреймов данных в R

# some data and a function 
df1<-data.frame(name=c("aa","bb","cc","dd","ee"),a=sample(1:50,5),b=sample(1:50,5),c=sample(1:50,5)) 
df2<-data.frame(name=c("aa","bb","cc","dd","ee"),a=sample(1:50,5),b=sample(1:50,5),c=sample(1:50,5)) 

simplefunction<-function(a,b){a+b} 

# apply on a single row 
simplefunction(df1[1,2],df2[1,2]) 

# apply over all colums 
apply(?) 

## apply over all columns and rows 
# create df to receive results 
df3<-df2 

# loop it 
for (i in 2:5)df3[i]<-apply(?) 
+0

Возможно, вам следует более точно определить, что вы подразумеваете под «применить по всем строкам и столбцам» и предоставить реальную воспроизводимую функцию и желаемый результат. – juba

+0

Извините за непонимание. Я отредактировал вопрос выше, в том числе, что это только примерная функция. Код воспроизводимый, и я намеревался сохранить его простым, чтобы сделать сообщение полезным для других. – Joschi

+0

+1 для обеспечения простого воспроизводимого примера (несмотря на недоразумение, которое оно приводит!). –

ответ

3

Мой первый mapply ответ !! Для вашего простого примера у вас есть ...

mapply(FUN = `+` , df1[,-1] , df2[,-1]) 
#   a b c 
# [1,] 60 35 75 
# [2,] 57 39 92 
# [3,] 72 71 48 
# [4,] 31 19 85 
# [5,] 47 66 58 

Вы можете продлить его, как так ...

mapply(FUN = function(x,y,z,etc){ simplefunctioncodehere} , df1[,-1] , df2[,-1] , ... other dataframes here) 

В dataframes будет принят для того, чтобы функции, так как в этом примере df1 будет x, df2 будет y и z и т. д., будут некоторые другие фреймы данных, которые вы укажете в этом порядке. Надеюсь, это имеет смысл. mapply будет принимать значения первой строки, первого столбца всех данных и применять эту функцию, затем первую строку, второй столбец всех кадров данных и применять эту функцию и так далее.

+0

работает отлично. Благодаря!! – Joschi

2

Вы также можете использовать Reduce:

set.seed(45) # for reproducibility 
Reduce(function(x,y) { x + y}, list(df1[, -1], df2[,-1])) 
# a b c 
# 1 53 22 23 
# 2 64 28 91 
# 3 19 56 51 
# 4 38 41 53 
# 5 28 42 30 
+1

+1 Мне всегда нравится видеть примеры «Уменьшить». Я не знаю почему. Возможно, это потому, что я постоянно слышу о 'map/reduce' :-) –

+0

Я попробовал' Reduce', но получаю список с результатами, а не с данными. любая идея, почему это может быть? – Joschi

+0

Какие данные? Не могли бы вы отредактировать свой оригинальный пост с данными, которые вы используете? В этом примере я возвращаю 'data.frame'. – Arun

1

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

df1[,-1] + df2[,-1] 

Что дает:

a b c 
1 52 24 37 
2 65 63 62 
3 31 90 89 
4 90 35 33 
5 51 33 45 
+0

Это всего лишь пример функции. Функция, которую я использую для моих данных, намного сложнее и работает только с другими функциями и параметрами в моем сценарии, поэтому я решил сохранить ее здесь просто. Я отредактирую его выше ... – Joschi