我有一个375k行的数据帧。我需要从另一个数据帧的一行中的值中减去该数据帧的每一行中的值。我使用的代码是:
`i=1
for(i in 1:nrow(df1)){
check <- df1 %>% mutate(col1 = (df1[i,2] - df2[1,2])^2)
i+1
}`
但是,由于行数,完成操作需要将近2个小时,我需要对所有行df2执行此操作。有没有一种有效的方法来做到这一点?
提前致谢
答案 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)