为数据框中第一次出现的变量提取行

use*_*883 36 r

我有一个包含两个变量的数据框,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返回比较向量中第一个匹配的索引,它们为您提供所需的行.

  • 为此,您必须首先确保您的数据框按任何列确定"第一个"实例进行排序.这可以使用`物种[与(物种,订单(日期)),]一起来完成[如此](http://stackoverflow.com/questions/1296646/how-to-sort-a-dataframe-by-列) (15认同)

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)


Sve*_*ein 9

在以下命令中,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)

  • 为此,您必须首先确保您的数据框按任何列确定"第一个"实例进行排序.这可以使用`物种[与(物种,订单(日期)),]一起来完成[如此](http://stackoverflow.com/questions/1296646/how-to-sort-a-dataframe-by-列) (3认同)

sin*_*dur 5

这是一个使用以下解决方案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)