为 ddply {plyr} 定义值范围以在进行组合时使用
Defining a range of values for ddply {plyr} to use when making combinations
我有相机陷阱数据,其格式包含每次观察的捕捉日期、物种和个体数量。例如:
> df
Date Sp Num
1 1/1/2015 a 1
2 1/1/2015 a 1
3 1/1/2015 b 2
4 1/3/2015 a 4
我想对给定日期记录的每个物种的总数求和,但也扩展数据集,以便每个日期和物种组合都有一个条目,没有观察到的日期的值为零给定的物种。我可以使用 ddply {plyr} 和 .drop=FALSE
命令来做到这一点。
> ddply(df, c("Date", "Sp"), function(df)sum(df$Num), .drop=FALSE)
Date Sp V1
1 1/1/2015 a 2
2 1/1/2015 b 2
3 1/3/2015 a 4
4 1/3/2015 b 0
问题是有些日子没有对任何物种进行观察(在上面的例子中,这将是 1/2/2015)。我想要 return 是这样的:
> df
Date Sp Num
1 1/1/2015 a 2
2 1/1/2015 b 2
3 1/2/2015 a 0
4 1/2/2015 b 0
5 1/3/2015 a 4
6 1/3/2015 b 0
有没有办法在向量中定义日期范围并要求 ddply 使用它而不是仅使用原始数据帧中的唯一日期?
我对 R 和 SO 比较陌生,所以如果这个问题太复杂,我提前道歉。
我们将 'Date' 转换为 Date
class。使用从最小到最大 "Date" 的序列和 "Sp" 的 unique
元素的组合创建一个新数据集。我们要么 merge
(来自 base R
),要么在我们得到 'Num' 列的 sum
后使用 dplyr
的 left_join
按 'Date' 和 'Sp'.
df$Date <- as.Date(df$Date, "%m/%d/%Y")
df1 <- expand.grid(Date=seq(min(df$Date), max(df$Date),
by = "1 day"), Sp=unique(df$Sp), stringsAsFactors=FALSE)
library(dplyr)
df %>%
group_by(Date, Sp) %>%
summarise(Num = sum(Num)) %>%
left_join(df1, .) %>%
mutate(Num = replace(Num, is.na(Num), 0)) %>%
arrange(Date) %>%
mutate(Date = format(Date, "%m/%d/%Y"))
# Date Sp Num
#1 01/01/2015 a 2
#2 01/01/2015 b 2
#3 01/02/2015 a 0
#4 01/02/2015 b 0
#5 01/03/2015 a 4
#6 01/03/2015 b 0
我有相机陷阱数据,其格式包含每次观察的捕捉日期、物种和个体数量。例如:
> df
Date Sp Num
1 1/1/2015 a 1
2 1/1/2015 a 1
3 1/1/2015 b 2
4 1/3/2015 a 4
我想对给定日期记录的每个物种的总数求和,但也扩展数据集,以便每个日期和物种组合都有一个条目,没有观察到的日期的值为零给定的物种。我可以使用 ddply {plyr} 和 .drop=FALSE
命令来做到这一点。
> ddply(df, c("Date", "Sp"), function(df)sum(df$Num), .drop=FALSE)
Date Sp V1
1 1/1/2015 a 2
2 1/1/2015 b 2
3 1/3/2015 a 4
4 1/3/2015 b 0
问题是有些日子没有对任何物种进行观察(在上面的例子中,这将是 1/2/2015)。我想要 return 是这样的:
> df
Date Sp Num
1 1/1/2015 a 2
2 1/1/2015 b 2
3 1/2/2015 a 0
4 1/2/2015 b 0
5 1/3/2015 a 4
6 1/3/2015 b 0
有没有办法在向量中定义日期范围并要求 ddply 使用它而不是仅使用原始数据帧中的唯一日期?
我对 R 和 SO 比较陌生,所以如果这个问题太复杂,我提前道歉。
我们将 'Date' 转换为 Date
class。使用从最小到最大 "Date" 的序列和 "Sp" 的 unique
元素的组合创建一个新数据集。我们要么 merge
(来自 base R
),要么在我们得到 'Num' 列的 sum
后使用 dplyr
的 left_join
按 'Date' 和 'Sp'.
df$Date <- as.Date(df$Date, "%m/%d/%Y")
df1 <- expand.grid(Date=seq(min(df$Date), max(df$Date),
by = "1 day"), Sp=unique(df$Sp), stringsAsFactors=FALSE)
library(dplyr)
df %>%
group_by(Date, Sp) %>%
summarise(Num = sum(Num)) %>%
left_join(df1, .) %>%
mutate(Num = replace(Num, is.na(Num), 0)) %>%
arrange(Date) %>%
mutate(Date = format(Date, "%m/%d/%Y"))
# Date Sp Num
#1 01/01/2015 a 2
#2 01/01/2015 b 2
#3 01/02/2015 a 0
#4 01/02/2015 b 0
#5 01/03/2015 a 4
#6 01/03/2015 b 0