【问题标题】:How do you subtract two data frames from one another in R如何在 R 中将两个数据帧相减
【发布时间】:2015-03-22 22:26:34
【问题描述】:

我有两个数据帧,我需要每次减去相同的列并将结果存储在不同的数据帧中:

输入(t)

structure(list(time = structure(c(2L, 1L, 3L), .Label = c("1/13/15 1:18 PM", 
"1/13/15 12:18 PM", "1/13/15 2:18 PM"), class = "factor"), web01 = c(24083L, 
24083L, 24083L), web03 = c(24083L, 24083L, 24083L)), .Names = c("time", 
"web01", "web03"), class = "data.frame", row.names = c(NA, -3L
))

输入(d)

structure(list(time = structure(c(2L, 1L, 3L), .Label = c("1/13/15 1:18 PM", 
"1/13/15 12:18 PM", "1/13/15 2:18 PM"), class = "factor"), web01 = c(7764.8335, 
7725, 7711.5), web03 = c(10885.5, 10582.333, 10104.5)), .Names = c("time", 
"web01", "web03"), class = "data.frame", row.names = c(NA, -3L
))

数据框 t 和 d 只是示例,我的实际数据框有 20 列。在这种情况下,数据帧 t 和 d 具有相同的列名,并且两个数据帧的每一行的时间都相同。

我需要在同一时间段内从 d 中减去 d,并将结果存储在不同的数据帧中。任何想法我如何在 R 中做到这一点

【问题讨论】:

    标签: r


    【解决方案1】:

    更新

    rbind_list 和 rbind_all 已被弃用。而是使用 bind_rows。

    基于 cmets 中的讨论并受到 Andrew 回答的启发:

    library(dplyr)
    df <- bind_rows(d,t) %>% 
      group_by(time = as.POSIXct(time, format="%m/%d/%Y %I:%M %p")) %>%
      summarise_each(funs(diff(.))) %>% 
      data.frame()
    

    这将按时间顺序保持时间并将结果转换为常规data.frame()

    【讨论】:

    • 谢谢史蒂文!我开始编辑我的帖子以反映您的补充,但这样效果更好。
    • 谢谢你们,太好了。
    • 如果您想节省一些击键,您可以在 group_by 中创建时间分组列并删除之前的 mutate 步骤。 group_by(time = as.POSIXct(time, format="%m/%d/%Y %I:%M %p"))
    • @docendodiscimus 感谢您的建议。我相应地编辑了答案。
    • 我认为你是对的,@Arun。可能也不需要 data.frame() 调用
    【解决方案2】:

    这是一个 data.table 方法:

    library(data.table)
    rbindlist(list(d,t))[, lapply(.SD, diff),
                     by = .(time = as.POSIXct(time, format="%m/%d/%y %I:%M %p"))]
    
    #                  time    web01    web03
    #1: 2015-01-13 12:18:00 16318.17 13197.50
    #2: 2015-01-13 13:18:00 16358.00 13500.67
    #3: 2015-01-13 14:18:00 16371.50 13978.50
    

    编辑:更正日期格式和输出,删除 .SDcols = ... .

    【讨论】:

      【解决方案3】:

      使用dplyr

      newdata<-
        rbind_list(d,t) %>%
        group_by(time) %>%
        summarise_each(funs(diff(.)))
      
      
      
                    time    web01    web03
      1  1/13/15 1:18 PM 16358.00 13500.67
      2 1/13/15 12:18 PM 16318.17 13197.50
      3  1/13/15 2:18 PM 16371.50 13978.50
      

      【讨论】:

      • 正如我所说,我的实际数据框有 21 列。当我执行 newdata 时,它会这样说:ource: local data frame [168 x 21] ,未显示变量。我怎么能看到整个 newdata 数据框?
      • 请注意,这会改变时间顺序。我可以建议:df &lt;- rbind_list(d,t) %&gt;% mutate(time = as.POSIXct(time, format="%m/%d/%Y %I:%M %p")) %&gt;% group_by(time) %&gt;% summarise_each(funs(diff(.))) %&gt;% arrange(time)
      • @user1471980 你看到这个是因为newdatatbl_df 中。见stackoverflow.com/questions/23188900/…
      • @StevenBeaupré,有没有办法将其转换回常规数据框?
      猜你喜欢
      • 1970-01-01
      • 2017-01-03
      • 2016-01-31
      • 1970-01-01
      • 2017-04-20
      • 2013-02-17
      • 1970-01-01
      相关资源
      最近更新 更多