设置的首次和最后出现我有一个表:如何找到在面板数据中的R
id time
1 1
1 2
1 5
2 3
2 2
2 7
3 8
3 3
3 14
我想将其转换为:
id first last
1 1 5
2 3 7
3 8 14
请帮帮忙!
设置的首次和最后出现我有一个表:如何找到在面板数据中的R
id time
1 1
1 2
1 5
2 3
2 2
2 7
3 8
3 3
3 14
我想将其转换为:
id first last
1 1 5
2 3 7
3 8 14
请帮帮忙!
我们可以使用data.table
。转换 'data.frame' 到 'data.table'(setDT(df1)
),由 'ID' 进行分组,我们得到的 '时间'
library(data.table)
setDT(df1)[, list(firstocc = time[1L], lastocc = time[.N]),
by = id]
或者与dplyr
,我们使用first
和last
值相同的方法。
library(dplyr)
df1 %>%
group_by(id) %>%
summarise(firstocc = first(time), lastocc = last(time))
或用base R
(无需包装)
do.call(rbind, lapply(split(df1, df1$id),
function(x) data.frame(id = x$id[1],
firstocc = x$time[1], lastocc = x$time[nrow(x)])))
如果我们需要立足于min
和max
值(不涉及预期的输出),该data.table
选项是
setDT(df1)[, setNames(as.list(range(time)),
c('firstOcc', 'lastOcc')) ,id]
和dplyr
是
df1 %>%
group_by(id) %>%
summarise(firstocc = min(time), lastocc = max(time))
当您按ID分组时,我不想订购ID。我想让它按照它的顺序排列。你能帮助我吗? –
@PreetRajdeo您可以将'id'转换为'factor'类并设置相同顺序的级别。即'df1%>%group_by(id = factor(id,levels = unique(id)))%>%summarize(firstocc = min(time),lastocc = max(time))' – akrun
有可以执行这种在R的聚集我们展示如何做到这一点没有任何包装,然后用一些包装显示了很多包。
1)使用aggregate
。无需包裹。
ag <- aggregate(time ~ id, DF, function(x) c(first = min(x), last = max(x)))
,并提供:
> ag
id time.first time.last
1 1 1 5
2 2 2 7
3 3 3 14
ag
是一个两列的数据帧,其第二列包含与名为“第一”列的两列的矩阵,并且“最后”。如果你想将它压平到3列数据帧使用:
do.call("cbind", ag)
捐赠:
id first last
[1,] 1 1 5
[2,] 2 2 7
[3,] 3 3 14
1A)的这种变化(1)是丑陋列名的代价更紧凑。
aggregate(time ~ id, DF, range)
2)sqldf
library(sqldf)
sqldf("select id, min(time) first, max(time) last from DF group by id")
,并提供:
id first last
[1,] 1 1 5
[2,] 2 2 7
[3,] 3 3 14
3)summaryBy summaryBy在doBy包很像aggregate
:
library(doBy)
summaryBy(time ~ id, data = DF, FUN = c(min, max))
给予:
id time.min time.max
1 1 1 5
2 2 2 7
3 3 3 14
注:这里是在重现的形式输入DF
:
Lines <- "id time
1 1
1 2
1 5
2 3
2 2
2 7
3 8
3 3
3 14"
DF <- read.table(text = Lines, header = TRUE)
更新:添加(1A),(2)和(3)和固定(1)。
可以删除重复和重塑它
dd <- read.table(header = TRUE, text = "id time
1 1
1 2
1 5
2 3
2 2
2 7
3 8
3 3
3 14")
d2 <- dd[!(duplicated(dd$id) & duplicated(dd$id, fromLast = TRUE)), ]
reshape(within(d2, tt <- c('first', 'last')), dir = 'wide', timevar = 'tt')
# id time.first time.last
# 1 1 1 5
# 4 2 3 7
# 7 3 8 14
的[提取行用于可变的在数据帧中的第一次出现(
可能的复制http://stackoverflow.com/questions/19944334/extract-行为数据帧中的变量的第一次出现) – JazzCat