2015-06-09 4 views
0

У меня есть две части вопроса для применения функции по набору данных в R.Применить функцию итеративно через dataframe

я: а) Во-первых, у меня есть 2 кадра данных, которые я хотел бы быть объединены и парные итеративно, так что что-то вроде функции cbind будет выравнивать первые столбцы каждого кадра данных рядом друг с другом, затем с 2-м столбцом и так далее. В приведенном ниже примере я хотел бы получить вывод, объединяющий df1 и df2, где порядок столбцов будет eg1, например4, eg2, eg5, eg3, eg6.

eg1 <- as.data.frame(matrix(sample(0:1000, 36*10, replace=TRUE), ncol=1)) 
eg2 <- as.data.frame(matrix(sample(0:500, 36*10, replace=TRUE), ncol=1)) 
eg3 <- as.data.frame(matrix(sample(0:750, 36*10, replace=TRUE), ncol=1)) 
df1 <- cbind(eg1,eg2,eg3) 
eg4 <- as.data.frame(matrix(sample(0:200, 36*10, replace=TRUE), ncol=1)) 
eg5 <- as.data.frame(matrix(sample(0:100, 36*10, replace=TRUE), ncol=1)) 
eg6 <- as.data.frame(matrix(sample(0:350, 36*10, replace=TRUE), ncol=1)) 
df2 <- cbind(eg4,eg5,eg6) 

Я знаю, что ручной способ сделать это (ниже), но это не было бы идеально, комбинируя гораздо большие наборы данных и мне было интересно, если есть более эффективный способ достижения этой цели?

df3 <- cbind(df1,df2) 
df3 <- df3[,c(1,4,2,5,3,6)] 

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

df4 <- df3[,1:2] 
High_7 <- tail(df4[order(df4[,2]),],7)#Highest 7 values in even column 
High_7 <- High_7[,1] #Select odd column values 

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

ответ

0

первого вопроса совмещения COLS обоих dataframes итеративно (обратите внимание, что это работает только в том случае, если имена обоих dataframes являются уникальными, что они не находятся в вашем OP):

df3 <- Reduce(cbind, 
     Map(function(x, y) cbind(df1[x], df2[y]), names(df1), names(df2))) 

для второго часть я хотел бы использовать это:

results <- sapply(seq(1,ncol(df3),2), 
         function(i) df3[order(df3[,i+1], decreasing = TRUE), ][1:7,i]) 

, если вы хотите, чтобы результаты быть data.frame просто сделать:

results <- data.frame(results)