如何创建一个新变量,首先观察不同的变量?

时间:2017-10-12 19:44:53

标签: r

假设我有一个包含三个变量的数据框,如下所示。如何为每个组创建一个新变量,以便第一次观察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

4 个答案:

答案 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();