Omr*_*tia 7 r vectorization dataframe
我有两个数据框,下面是每个的一个小样本:
df1 <- data.frame(a1= c(3,4), a2 = c(8, 8), a3 = c(4, 18), a4 = c(9,9), a5 = c(17, 30))
df2 <- data.frame(a1 = c(2,2,2,3,3,3,4,4,4), a2 = c(7,7,7,7,7,7,7,7,7),
a3 = c(4,4,4,4,4,4,4,4,4), a4 = c(10,10,10, 10, 10, 10, 10,10,10),
a5 = c(15,16,17, 15, 16, 17, 15, 16, 17))
Run Code Online (Sandbox Code Playgroud)
我想检查,对于每一行df1,它是否有"邻居" df2,其中,邻居我的意思是每列中最多1个(绝对值)不同的观察.因此,例如,第2行df2是第1行的邻居df1.
我目前这样做的方式如下:
sweep(as.matrix(df2), 2, as.matrix(df1[1,]), "-")
Run Code Online (Sandbox Code Playgroud)
对于第1行df1,我必须为df1的每一行重复此操作.请注意,df2和df1的行数不同.
但是,我真正想要的是避免"按行"这样做,因为我的数据框有很多行.有没有办法矢量化?
您可以使用将行拆分df1为列表,然后使用lapply来实现矢量化:
my_list=lapply(as.list(data.frame(t(df1))),function(x) sweep(as.matrix(df2), 2, as.matrix(x), "-"))
Run Code Online (Sandbox Code Playgroud)
的每个元素my_list是每行的计算结果df1
my_list[[1]]
a1 a2 a3 a4 a5
[1,] -1 -1 0 1 -2
[2,] -1 -1 0 1 -1
[3,] -1 -1 0 1 0
[4,] 0 -1 0 1 -2
[5,] 0 -1 0 1 -1
[6,] 0 -1 0 1 0
[7,] 1 -1 0 1 -2
[8,] 1 -1 0 1 -1
[9,] 1 -1 0 1 0
Run Code Online (Sandbox Code Playgroud)
此外,您还可以使用parallel::mclapply比传统方式更快的lapply