我是R的新手,似乎我发现问题的解决方案花费了太多时间。
我有2个数据帧:
UniqueID colA colB
1 x y
2 x y
3 x y
4 x y
和
UniqueID category date
1 a d1
1 a d2
1 b d3
2 c d4
3 a d5
3 a d6
我想获得一个数据帧,稍后将附加到第一个数据帧,例如(假设d1< d2和d5< d6)
UniqueID totaloccurrences occurrencescatA MindatecatA MaxdatecatA
1 3 2 d1 d2
2 1 0 0 0
3 2 2 d5 d6
对于每个Id我需要计算它在第二个数据帧中出现的总次数,然后计算每个类别的出现次数,并记录早期和最新的观察结果。
我能做的最好的就是使用for循环:
iteractions <- nrow(A)
for (i in 1:iteractions) {
compiled[i, "ID"] <- A[i, "UniqueID"]
compiled[i, "totaloccurrences"] <- length(B$UniqueID[B$UniqueID ==compiled[i, "ID"]])
compiled[i, "occurrencescatA"] <- length(B$UniqueID[B$UniqueID ==compiled[i, "ID"] & B$category == "d1"]
if (compiled[i, "occurencescatA"] != 0) {
compiled[i, "MindatecatA"] <- min(B$date[B$category =="a" & B$UniqueID ==compiled[i, "ID"]])
...
依此类推最大日期,然后对每个类别重复。
问题是:数据框很大,这需要很长时间。我觉得我缺乏技巧,但是在这里任何帮助都会受到赞赏!
答案 0 :(得分:0)
以下是tidyverse
方法:
library(tidyverse);
printDate <- function(x) format(x, "%d-%m-%Y");
left_join(
df2 %>% mutate(date = as.Date(date, format = "%d-%m-%Y")),
df1) %>%
group_by(UniqueID) %>%
summarise(
totaloccurrences = n(),
occurrencescatA = sum(category == "a"),
MindatecatA = ifelse(occurrencescatA > 0, printDate(min(date[category == "a"])), "0"),
MaxdatecatA = ifelse(occurrencescatA > 0, printDate(max(date[category == "a"])), "0"))
## A tibble: 3 x 5
# UniqueID totaloccurrences occurrencescatA MindatecatA MaxdatecatA
# <int> <int> <int> <chr> <chr>
#1 1 3 2 01-05-2018 02-05-2018
#2 2 1 0 0 0
#3 3 2 2 05-05-2018 06-05-2018
说明:执行df1
和df2
的左连接,UniqueID
的组条目,并使用summarise
返回汇总数量。
请注意,我生成了一些示例date
来说明。
df1 <- read.table(text =
"UniqueID colA colB
1 x y
2 x y
3 x y
4 x y", header = T)
df2 <- read.table(text =
"UniqueID category date
1 a 01-05-2018
1 a 02-05-2018
1 b 03-05-2018
2 c 04-05-2018
3 a 05-05-2018
3 a 06-05-2018", header = T)