从r中另一个数据帧的列中的值中减去列的每个值

时间:2017-08-13 11:58:55

标签: r

我有一个375k行的数据帧。我需要从另一个数据帧的一行中的值中减去该数据帧的每一行中的值。我使用的代码是:

`i=1
 for(i in 1:nrow(df1)){
     check <-  df1 %>% mutate(col1 = (df1[i,2] - df2[1,2])^2)
     i+1
  }`

但是,由于行数,完成操作需要将近2个小时,我需要对所有行df2执行此操作。有没有一种有效的方法来做到这一点?

提前致谢

2 个答案:

答案 0 :(得分:1)

而不是循环,可以通过使用'df2'第1列的mutate_all元素减去first中的所有列来进行矢量化

library(dplyr)
df1 <- df1 %>%
         mutate_all(funs((. - first(df2[[1]]))^2))

根据评论,如果我们需要在'df2'列中减去'df1的相应列与first元素的列,则可以使用Map

data.frame(Map(`-`, df1, df2[1,]))

tidyverse

map2_df(df1, df2[1,], `-`)

数据

set.seed(24)
df1 <- as.data.frame(matrix(sample(1:10, 5*10, replace = TRUE), ncol=5))
df2 <- as.data.frame(matrix(sample(1:5, 5*10, replace = TRUE), ncol=5))

答案 1 :(得分:0)

使用R,您希望对您的操作进行矢量化&#39;。那就是你想要在整个向量(本例中的列)中同时操作,而不是单独处理每一行,就像for循环一样。

所以,如果我的df2是df1 <- data.frame(mycol = c(1,2,3,4))而我的df2是df2 <- data.frame(mycol2 = c(2,3,4,5))。然后你可以这样写:

library(dplyr)

df1 <- data.frame(mycol = c(1,2,3,4))

df2 <- data.frame(mycol2 = c(2,3,4,5))

df1 <- df1 %>% mutate(mynewcol = mycol - df2[1,1]^2)

df2[1,1]实际上是在创建一个新对象,所以如果你想要一个中间步骤,你可以这样做:

library(dplyr)

df1 <- data.frame(mycol = c(1,2,3,4))

df2 <- data.frame(mycol2 = c(2,3,4,5))

my_new_object <- as.integer(df2[1,1])

df1 <- df1 %>% mutate(mynewcol = mycol - my_new_object^2)