假设我有一个包含三个变量的数据框,如下所示。如何为每个组创建一个新变量,以便第一次观察x
?
group year x
1 2000 3
1 2001 4
2 2000 1
2 2001 3
3 2000 5
3 2001 2
我想创建这样的东西:
group year x y
1 2000 3 3
1 2001 4 3
2 2000 1 1
2 2001 3 1
3 2000 5 5
3 2001 2 5
答案 0 :(得分:3)
设置数据,例如:
dd <- data.frame(group=rep(1:3,each=2),
year=rep(2000:2001,3),
x=c(3,4,1,3,5,2))
在基地R中,使用ave()
。默认情况下,它会查找组平均值(而不是第一个值),但我们可以使用FUN
参数来要求它选择第一个值。
dd$y <- ave(dd$x, dd$group, FUN=function(x) x[1])
## or
dd <- transform(dd,y=ave(x, group, FUN=function(x) x[1])
(或者可以使用FUN=function(x) head(x,1)
)
在tidyverse中,
library(dplyr)
dd <- dd %>%
group_by(group) %>%
mutate(y=first(x))
@lmo在评论中指出了另一种选择:
library(data.table)
setDT(dd)[, y := first(x), by=group]
你可以在其他地方找到这三种主要方法(基本R与tidyverse与data.table)的相对优点的无穷无尽的讨论(在StackOverflow和一般的interwebs上)。
答案 1 :(得分:1)
使用包plyr
:
df <- data.frame(group=c(1,1,2,2,3,3),
year=c(2000,2001,2000,2001,2000,2001),
x=c(3,4,1,3,5,2))
library(plyr)
ddply(df, .(group), transform, y=x[1])
答案 2 :(得分:0)
基础R中的简单版本
### Your data
df = read.table(text="group year x
1 2000 3
1 2001 4
2 2000 1
2 2001 3
3 2000 5
3 2001 2",
header=TRUE)
df$y = aggregate(as.numeric(row.names(df)), list(df$group), min)$x[df$group]
df
group year x y
1 1 2000 3 1
2 1 2001 4 1
3 2 2000 1 3
4 2 2001 3 3
5 3 2000 5 5
6 3 2001 2 5
答案 3 :(得分:0)
这是另一种方式,使用基数R:
onHoverA(); onHoverB();