Применять функцию итеративно через фрейм данных

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

i) Во-первых, у меня есть 2 фрейма данных, которые я хотел бы объединить и спарить итеративно, чтобы что-то вроде функции cbind выстраивало 1-й столбец каждого фрейма данных рядом друг с другом, затем 2-й столбец и так далее. В приведенном ниже примере я хотел бы, чтобы вывод объединял df1 и df2, где порядок столбцов был бы eg1, eg4, 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

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


person James White    schedule 09.06.2015    source источник


Ответы (1)


для вашего первого вопроса о многократном объединении столбцов обоих фреймов данных (обратите внимание, что это работает только в том случае, если имена обоих фреймов данных уникальны, чего нет в вашем 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)
person grrgrrbla    schedule 09.06.2015