按两列数据框R中的条件求和[重复]

xtfmy6hx  于 2023-05-20  发布在  其他
关注(0)|答案(3)|浏览(86)

此问题已在此处有答案

Conditional summing (R)(6个回答)
8年前关闭。
我有这样的数据框

date            apps    long
10/22/2013 23:51    A   2
10/22/2013 23:52    B   3
10/22/2013 23:52    C   1
10/23/2013 7:03     C   5
10/23/2013 7:13     A   1
10/23/2013 7:31     B   4
10/23/2013 7:31     A   5
10/23/2013 7:31     B   2
10/24/2013 0:54     B   3
10/24/2013 1:16     C   2
10/24/2013 1:16     C   1
10/24/2013 3:27     A   2
10/24/2013 7:30     A   3
10/24/2013 7:30     A   1

我遇到的问题是:我想合计一下A、B、C应用每天花费的时间。因此输出将如下所示:

A 10/22/2013 2
A 10/23/2013 6
A 10/24/2013 6
etc...

我尝试了一些语法,但它不工作。

rkue9o1l

rkue9o1l1#

首先,我假设您的data.frame名为dd。这里是一个复制/粘贴的形式

dd <- structure(list(date = structure(c(1L, 2L, 2L, 3L, 4L, 5L, 5L, 
5L, 6L, 7L, 7L, 8L, 9L, 9L), .Label = c("10/22/2013 23:51", "10/22/2013 23:52", 
"10/23/2013 7:03", "10/23/2013 7:13", "10/23/2013 7:31", "10/24/2013 0:54", 
"10/24/2013 1:16", "10/24/2013 3:27", "10/24/2013 7:30"), class = "factor"), 
    apps = structure(c(1L, 2L, 3L, 3L, 1L, 2L, 1L, 2L, 2L, 3L, 
    3L, 1L, 1L, 1L), .Label = c("A", "B", "C"), class = "factor"), 
    long = c(2L, 3L, 1L, 5L, 1L, 4L, 5L, 2L, 3L, 2L, 1L, 2L, 
    3L, 1L)), .Names = c("date", "apps", "long"), class = "data.frame", row.names = c(NA, 
-14L))

您应该将日期转换为适当的日期值

dd$date <- as.POSIXct(as.character(dd$date), format="%m/%d/%Y %H:%M", tz="GMT")

然后,您可以使用aggregate创建一个漂亮的data.frame,这里使用as.Date剥离时间

aggregate(long ~ as.Date(date) + apps, dd, FUN=sum)

这个返回

as.Date(date) apps long
1    2013-10-22    A    2
2    2013-10-23    A    6
3    2013-10-24    A    6
4    2013-10-22    B    3
5    2013-10-23    B    6
6    2013-10-24    B    3
7    2013-10-22    C    1
8    2013-10-23    C    5
9    2013-10-24    C    3
kgqe7b3p

kgqe7b3p2#

我相当肯定这是重复的地方,但我在我的前三个搜索失败,所以在这里:

tapply( dat$long, list(dt = format( as.POSIXct(dat$date, "%d-%m-%Y %H:%M"), 
                                    "%d-%m-%Y"),
                        grp=dat$apps ),
                  sum)
polkgigr

polkgigr3#

在Flick先生的dd上使用dplyr

library(dplyr)
dd%>% 
group_by(apps, date=gsub("\\s+.*","",date))%>%
summarize(long=sum(long))
#      apps       date long
# 1    A 10/22/2013    2
# 2    A 10/23/2013    6
# 3    A 10/24/2013    6
# 4    B 10/22/2013    3
# 5    B 10/23/2013    6
# 6    B 10/24/2013    3
# 7    C 10/22/2013    1
# 8    C 10/23/2013    5
# 9    C 10/24/2013    3

相关问题