我有一个包含两个变量Date and Taxa的数据框,并希望获得每个分类单元首次出现的日期。数据框中有9个不同的日期和40个不同的分类单元,由172行组成,但我的答案应该只有40行。
Taxa是一个因素,Date是一个日期。
例如,我的数据框(称为“种类”)设置如下:
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
我会寻找这样的答案:
Date Taxa
2012-05-17 A
2011-08-31 B
2012-09-06 C
我尝试使用:
t.first <- species[unique(species$Taxa),]
它给了我正确的行数但是重复了Taxa。如果我只使用独特的(物种$ Taxa)它似乎给了我正确的答案,但后来我不知道它第一次出现的日期。
感谢您的帮助。
答案 0 :(得分:41)
t.first <- species[match(unique(species$Taxa), species$Taxa),]
应该给你你想要的东西。 match
返回比较向量中第一个匹配的索引,为您提供所需的行。
答案 1 :(得分:8)
在以下命令中,duplicated
为重复的data$Taxa
值创建逻辑索引。使用以下命令创建没有相应行的数据框的子集:
data[!duplicated(data$Taxa), ]
结果:
Date Taxa
1 2012-05-17 A
2 2011-08-31 B
3 2012-09-06 C
答案 2 :(得分:1)
这应该可以解决问题:
# Create some dummy data:
# Create some dates
Date=as.POSIXct(c("2013-07-12","2011-08-31","2012-09-06","2009-01-01",
"2012-05-17","2013-07-12","2012-09-07","2013-02-02"))
# Create unique taxa
Taxa=rep(c("A","B","C","D"),2)
# Combine the two into a dataframe
data=as.data.frame(list(Date=Date,Taxa=Taxa))
# this returns a numeric vector of the minimum dates
xx=tapply(data$Date,list(data$Taxa),min)
# And this will return a dataframe with the first occurence
# of your taxa (or variables)
as.data.frame(list(Date=as.POSIXct(xx,origin="1970-01-01"),
Taxa=names(xx)))
注意:您可以在tapply中添加simplify = T以返回POSIXt 对象,但它返回一个列表。更多信息可以在这里找到: Unexpected behaviour of min, tapply and POSIXct/POSIXlt classes?
答案 3 :(得分:1)
这是一个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)
通过按日期排序也可以得到相同的结果:
df %>%
mutate(Date = as.Date(Date)) %>%
group_by(Taxa) %>%
arrange(Date) %>%
slice(1) %>%
ungroup()
答案 4 :(得分:0)
这是使用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
数据:
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")
)