当元素依赖于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
frombase 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]