【问题标题】:Use value in colum as argument in function使用列中的值作为函数中的参数
【发布时间】: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,特别是 nestmap 函数。
  • 我一直在摆弄这个函数......我能想到的最好的就是 SmallDF2 % mutate(listoflists = map2(User, Log, Pass,newfn )) %>% print() 我哪里出错了?

标签: r


【解决方案1】:

想通了....

  rowfinder<- function(User,Log,Pass){
    subset(Sensor.Data[(min(which(Sensor.Data$User==User&Sensor.Data$Log==Log & Sensor.Data$Pass==Pass))-100):(max(which(Sensor.Data$User==User&Sensor.Data$Log==Log & Sensor.Data$Pass==Pass))+100),],select=LH.passing.distance)
  }
  SmallDF$LHvalues<-apply(SmallDF[,c('User','Log','Pass')], 1, function(y) rowfinder(y['User'],y['Log'],y['Pass']))

【讨论】:

    猜你喜欢
    • 2021-12-05
    • 2018-12-10
    • 2014-05-03
    • 2022-10-06
    • 2021-01-04
    相关资源
    最近更新 更多