【问题标题】:How to use values from one data frame to inform a summing function within another data frame in R?如何使用来自一个数据帧的值来通知 R 中另一个数据帧中的求和函数?
【发布时间】:2019-04-02 16:23:23
【问题描述】:

我有大量来自动物运动数据的 GPS 点的数据框。我计算了连续点之间的距离并将其存储为单独的列。所以我的数据看起来像这样:

< Dist
  TagID    Date        Time      location.long location.lat Distance
    FW  15.10.2018  02:12:14.000    26.8666632  41.6550714  0
    FW  15.10.2018  02:15:22.000    26.8666077  41.655001   3.7
    FW  15.10.2018  02:31:12.000    26.8666417  41.6551456  4.5
    FW  15.10.2018  02:50:47.000    26.8665424  41.6549653  2.4
    FW  15.10.2018  03:00:45.000    26.8665161  41.6549384  9.8
    FW  15.10.2018  03:05:35.000    26.8665179  41.6549765  8.8
    FW  16.10.2018  08:00:20.000    26.8664499  41.6549864  0
    FW  16.10.2018  08:05:07.000    26.8664861  41.6550659  1.1
    FW  16.10.2018  08:10:08.000    26.8665225  41.655125   7.5
    FW  16.10.2018  08:15:06.000    26.866505   41.6550936  7.5
    FW  16.10.2018  08:20:06.000    26.8664646  41.6550879  3.2
    FW  16.10.2018  08:25:07.000    26.8635185  41.6515747  6.6
    FW  16.10.2018  08:40:28.000    26.8664751  41.6550872  2.3
    FW  17.10.2018  10:10:06.000    26.8735928  41.5852645  0
    FW  17.10.2018  10:15:06.000    26.8455718  41.5654656  3.2
    FW  17.10.2018  10:20:06.000    26.7989363  41.543988   4.5
    FW  17.10.2018  10:25:06.000    26.7581078  41.5424566  3.4
    FW  17.10.2018  10:30:06.000    26.7282547  41.560534   3.1
    FW  17.10.2018  10:35:06.000    26.7184667  41.5541104  1.0
    FW  17.10.2018  10:40:06.000    26.6363721  41.549993   6.8
    FW  17.10.2018  10:45:06.000    26.6293603  41.5496727  0.5
    FW  17.10.2018  10:50:06.000    26.6293732  41.5496753  11.2
    FW  17.10.2018  10:55:06.000    26.6293623  41.5496688  7.8
    FW  17.10.2018  11:00:06.000    26.6292996  41.549678   9.4
    FW  17.10.2018  11:05:07.000    26.6293224  41.5496449  1.2
    FW  18.10.2018  08:40:06.000    26.6294363  41.5496057  0
    FW  18.10.2018  08:45:06.000    26.6294137  41.5496145  16.3
    FW  18.10.2018  08:50:06.000    26.6294167  41.5496079  12.4
    FW  18.10.2018  08:55:06.000    26.6294302  41.549607   22.0
    FW  18.10.2018  09:00:06.000    26.6294248  41.5496141  4.3
    FW  18.10.2018  09:05:06.000    26.6294258  41.549612   2.1
    FW  18.10.2018  09:10:06.000    26.6294335  41.5496148  0.6
    FW  18.10.2018  09:15:06.000    26.6294349  41.5496131  1.6
    FW  18.10.2018  09:20:06.000    26.6294279  41.5496086  11.6
    FW  18.10.2018  09:25:06.000    26.6294394  41.5496087  2.3
    FW  18.10.2018  09:30:07.000    26.6294366  41.5496005  1.8
    FW  18.10.2018  09:35:06.000    26.6294161  41.5496169  7.5
    FW  18.10.2018  09:40:06.000    26.6294205  41.5496155  12.6
    FW  18.10.2018  09:45:07.000    26.6294313  41.5496143  5.9

在另一个数据框(“行”)中,我有以下信息:

< Rows
Date    Row_number
15.10.2018  4
16.10.2018  5
17.10.2018  9
18.10.2018  12

“Row_number”中的值显示了我特别感兴趣的第一个数据帧中的行号。 所以我需要使用第二个数据框(“行”)作为信息来源。基于“Dist”,我需要计算每个特定日期从第一行到“Rows”数据框中指示的行号的“Distance”列中的值的总和。 例如对于 15.10.2018,我需要将距离相加到第四行 - 0+3.7+4.5+2.4=10.6。 2018 年 10 月 17 日第一行到第 9 行的总和,以此类推。

所以我想我应该首先按日期拆分数据以创建单独的单元,而不是以某种方式使用 sapply?

sp <- split(Dist, Dist$Date)
sapply(sp, function(sp){.....

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以将两个数据集连接起来,然后按'Date'分组,得到'Distance'的sum,根据'Row_number'的值得到子集

    library(tidyverse)
    left_join(Dist, Rows) %>% 
        group_by(Date) %>%
        mutate(DistanceSum = sum(Distance[seq_len(Row_number[1])], na.rm = TRUE))
    

    【讨论】:

    • 非常感谢!这正是我所需要的!
    • 现在我尝试使用更大的数据集并意识到只有它返回的第一个值是正确的。由于某种原因,下一个值是错误的。对于上面 15.10.2018 的示例,它正确返回 10.6 的总和,但对于 16.10.2018,结果是 20.4 但它应该是 19.3(该日期从第一行到第 5 行的总和)。任何想法?打扰了
    • @VSta 在你的描述中,它说序列是从 1 开始计数的。
    • 对此感到抱歉。我的意思是从每个日期的第一点开始。所以,想法是把当天第一个点到当天第n个点的距离相加
    • @VSt 测试您的条件有点困难,因为示例显示的行号为 134 和其他。能否请您根据示例更改它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2021-06-19
    • 2020-07-24
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多