我有一个包含两个变量的数据框,Date和Taxa,并希望获得每个分类单元首次出现的日期.数据框中有9个不同的日期和40个不同的分类单元,由172行组成,但我的答案应该只有40行.
分类是一个因素,日期是一个日期.
例如,我的数据框(称为"种类")设置如下:
Date Taxa
2013-07-12 A
2011-08-31 B
2012-09-06 C
2012-05-17 A
2013-07-12 C
2012-09-07 B
Run Code Online (Sandbox Code Playgroud)
我会寻找这样的答案:
Date Taxa
2012-05-17 A
2011-08-31 B
2012-09-06 C
Run Code Online (Sandbox Code Playgroud)
我试过用:
t.first <- species[unique(species$Taxa),]
Run Code Online (Sandbox Code Playgroud)
它给了我正确的行数但是重复了Taxa.如果我只使用独特的(物种$ Taxa)它似乎给了我正确的答案,但后来我不知道它第一次出现的日期.
谢谢你的帮助.
ale*_*han 44
t.first <- species[match(unique(species$Taxa), species$Taxa),]
Run Code Online (Sandbox Code Playgroud)
应该给你你想要的东西.match返回比较向量中第一个匹配的索引,它们为您提供所需的行.
sbh*_*bha 11
这是一个dplyr不依赖于按日期顺序排序的数据并考虑关系的选项:
library(dplyr)
df %>%
mutate(Date = as.Date(Date)) %>%
group_by(Taxa) %>%
filter(Date == min(Date)) %>%
slice(1) %>% # takes the first occurrence if there is a tie
ungroup()
# A tibble: 3 x 2
Date Taxa
<date> <chr>
1 2012-05-17 A
2 2011-08-31 B
3 2012-09-06 C
# sample data:
df <- read.table(text = 'Date Taxa
2013-07-12 A
2011-08-31 B
2012-09-06 C
2012-05-17 A
2013-07-12 C
2012-09-07 B', header = TRUE, stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)
您也可以通过按日期排序来获得相同的结果:
df %>%
mutate(Date = as.Date(Date)) %>%
group_by(Taxa) %>%
arrange(Date) %>%
slice(1) %>%
ungroup()
Run Code Online (Sandbox Code Playgroud)
在以下命令中,duplicated为重复data$Taxa值创建逻辑索引.使用以下内容创建没有相应行的数据框的子集:
data[!duplicated(data$Taxa), ]
Run Code Online (Sandbox Code Playgroud)
结果:
Date Taxa
1 2012-05-17 A
2 2011-08-31 B
3 2012-09-06 C
Run Code Online (Sandbox Code Playgroud)
这是一个使用以下解决方案data.table:
library(data.table)
setDT(species)
species[, .SD[which.min(Date)], by = Taxa]
# Taxa Date
# 1: A 2012-05-17
# 2: B 2011-08-31
# 3: C 2012-09-06
Run Code Online (Sandbox Code Playgroud)
数据:
species <- data.frame(
Date = as.Date(c("2013-07-12", "2011-08-31", "2012-09-06",
"2012-05-17", "2013-07-12", "2012-09-07")),
Taxa = c("A", "B", "C", "A", "C", "B")
)
Run Code Online (Sandbox Code Playgroud)