如何将函数应用于数据帧的每两列而不重复?

时间:2018-04-14 04:18:36

标签: r dataframe

我有一个2000行和40000列的数据框,我想在不重复的情况下对每两列应用一个函数。在下面的示例中,我想添加每两列的值,如V1和V2,V3和V4。

set.seed(42)
df <- as.data.frame(matrix(rnorm(16),4))

df
          V1          V2         V3         V4
1  1.3709584  0.40426832  2.0184237 -1.3888607
2 -0.5646982 -0.10612452 -0.0627141 -0.2787888
3  0.3631284  1.51152200  1.3048697 -0.1333213
4  0.6328626 -0.09465904  2.2866454  0.6359504

欲望输出就像

data.frame("V1" = df$V1+df$V2, "V2"=df$V3+df$V4)

          V1         V2
1  1.7752268  0.6295630
2 -0.6708227 -0.3415029
3  1.8746504  1.1715483
4  0.5382036  2.9225958

我正在考虑使用combn但它是重复的。有人可以帮忙吗?谢谢!

2 个答案:

答案 0 :(得分:1)

尝试使用map2_df库中的purrr

library(purrr)    
map2_df(.x = df[seq(1,ncol(df),2)], .y = df[seq(2, ncol(df), 2)], ~ .x + .y)

#  A tibble: 4 x 2
#       V1     V3
#    <dbl>  <dbl>
# 1  1.78   0.630
# 2 -0.671 -0.342
# 3  1.87   1.17 
# 4  0.538  2.92 

答案 1 :(得分:1)

执行此操作的最简单方法可能是使用两个序列进行索引 - 一个提供c(1, 3, ...),另一个提供c(2, 4, ...) - 并添加结果:

df[, seq(1,length(df),2)] + df[, seq(2,length(df),2)]

#           V1         V3
# 1  1.7752268  0.6295630
# 2 -0.6708227 -0.3415029
# 3  1.8746504  1.1715483
# 4  0.5382036  2.9225958