当元素依赖于dataframe中的其他元素时,如何将此R函数矢量化

当元素依赖于dataframe中的其他元素时,如何将此R函数矢量化,r,for-loop,vectorization,R,For Loop,Vectorization,考虑这个数据帧: col1 | col2 1 | 1 1 | 2 1 | 3 2 | 4 2 | 5 2 | 6 我想在数据帧中创建一个新列,比如说col3,它有以下定义:ith元素col3[I]是所有j的col2[j]的所有值的平均值,使得col1[I]==col1[j]&&I=j 它的for循环如下所示: for (i in 1:length(data$col2)) { sum = 0 count = 0 for (

考虑这个数据帧:

col1 | col2
  1  |  1 
  1  |  2
  1  |  3
  2  |  4
  2  |  5
  2  |  6
我想在数据帧中创建一个新列,比如说
col3
,它有以下定义:
ith
元素
col3[I]
是所有j的
col2[j]
的所有值的平均值,使得
col1[I]==col1[j]&&I=j

它的for循环如下所示:

for (i in 1:length(data$col2))
{
    sum = 0
    count = 0
    for (j in 1:length(data$col1))
    {
        if (data$col1[j] == data$col1[i] && i!=j)
        {
            sum = sum + data$col2[j]
            count = count + 1
        }
    }
    data$col3[i] = sum/count
}
最后一个表格是:

col1 | col2 | col3
  1  |  1   | 2.5
  1  |  2   | 2
  1  |  3   | 1.5
  2  |  4   | 5.5
  2  |  5   | 5
  2  |  6   | 4.5

我可以使用一个apply函数,但这将花费我与for循环一样多的时间,对吗?非常感谢提供此循环矢量化版本的任何帮助。

您可以使用
dplyr

library(dplyr)
dat %>% group_by(col1) %>%
        mutate(col3 = (sum(col2) - col2)/(n()-1))
Source: local data frame [6 x 3]
Groups: col1 [2]

   col1  col2  col3
  (int) (int) (dbl)
1     1     1   2.5
2     1     2   2.0
3     1     3   1.5
4     2     4   5.5
5     2     5   5.0
6     2     6   4.5

这可以通过
ave
from
base R

df1$col3 <- with(df1, ave(col2, col1, 
                FUN=function(x) (sum(x)-x)/(length(x)-1)))
library(data.table)
setDT(df1)[, col3 := (sum(col2)-col2)/(.N-1) , col1]