【发布时间】:2018-04-18 07:21:43
【问题描述】:
我有两个数据框,一个带有一个包含 3 个索引变量的列表:User、Log 和 Pass,其中一个对于每个变量都有很多值。
我正在尝试将大 DF 中的许多值传递到较小 DF 中的列表中,以便稍后执行汇总统计。
Small.DF
User,Log,Pass,Valid.Event.Pass
1 11 76 Yes
1 11 46 Yes
1 15 38 Yes
1 15 47 Yes
1 15 386 Yes
1 15 388 Yes
1 8 119 Yes
1 8 120 Yes
1 8 121 Yes
1 8 122 Yes
1 8 123 Yes
1 16 35 Yes
1 16 37 Yes
1 17 22 Yes
1 17 102 Yes
1 12 203 Yes
1 12 205 Yes
1 12 207 Yes
1 12 209 Yes
1 12 24 Yes
2 13 29 Yes
2 1 31 Yes
Big.DF
User,Log,Pass,Passing.Distance
1 11 0 739.5
1 11 0 411.5
1 11 0 0
1 11 0 739.5
1 11 0 0
1 11 0 739.5
1 11 0 0
1 0 0 739.5
1 0 0 0
1 0 0 739.5
1 0 0 0
1 0 0 739.5
1 0 0 0
1 0 0 739.5
1 15 76 371.5
1 15 76 371.5
1 15 76 370.5
1 15 767 368.5
1 15 76 367.5
1 15 76 366.5
1 15 76 365.5
1 15 76 364.5
1 15 76 364.5
1 15 76 363.5
1 15 76 364.5
1 15 76 0
1 15 76 739.5
1 15 76 369.5
1 15 76 0
1 15 76 739.5
1 15 0 0
1 15 0 739.5
1 15 0 0
1 15 0 739.5
1 15 0 0
1 15 0 739.5
1 15 0 0
1 15 0 739.5
1 15 0 0
1 15 0 739.5
1 15 0 0
1 15 0 739.5
1 15 0 0
我对在 Big.DF 中匹配这三个变量的值以及之前的 100 个值和之后的 100 个值感兴趣。
为了实现这一点,我编写了一个可以创建这样一个列表的函数:
newfn<- function(User,Log,Pass){
test<-subset(Sensor.Data[(min(which(Big.DF$User==User&Big.DF$Log==Log & Big.DF$Pass==Pass))-100):(max(which(Big.DF$User==User&Big.DF$Log==Log & Big.DF$Pass==Pass))+100),],select=Passing.Distance)
}
但我不知道如何将此函数应用于 smalldf 中的每一行。
我能想到的最简单的解释是
Small.df$listofvalues<- newfn(Small.df$User,Small.df$Log,Small.df$Pass)
但这行不通,原因有几个……
如果它是 apply 它会是这样的
Small.df$listofvalues<-apply(smalldf,1,newfn)
但这并不完全奏效......而且扫荡似乎也不完全正确。有什么我缺少的功能吗?
【问题讨论】:
-
我建议使用 tidyverse,特别是
nest和map函数。 -
我一直在摆弄这个函数......我能想到的最好的就是 SmallDF2 % mutate(listoflists = map2(User, Log, Pass,newfn )) %>% print() 我哪里出错了?
标签: r