【问题标题】:How to identify unique rows and unique observations in a data.frame, based on time variable如何根据时间变量识别 data.frame 中的唯一行和唯一观察值
【发布时间】:2016-03-27 21:23:44
【问题描述】:

我有以下数据:

d <- data.frame(id=c(1,2,3,4,5,6,7), 
             year=c(1999,1999,1999,2000,2000,2000,2000), 
             var1=c(1,1,2,1,4,1,8),
             var2=c(1,1,2,1,5,2,0),
             var3=c(0,0,0,0,7,0,0))

> d
  id year var1 var2 var3
1  1 1999    1    1    0
2  2 1999    1    1    0
3  3 1999    2    2    0
4  4 2000    1    1    0
5  5 2000    4    5    7
6  6 2000    1    2    0
7  7 2000    8    0    0

我想评估 data.frame 的每一行并在名为“comb”的新变量中返回一个分数。

如果一行包含 var1-var3 之间的组合,即:

  • 前几年从未观察到(但元素是)-->assign comb=1
  • 包含一个前几年从未见过的元素-->assign comb=2
  • 前几年从未观察到并拥有一个新元素-->assign comb=3
  • 往年观察-->assign comb=0

一些旁注:

  • 出现的顺序无关紧要 (1,1,2 == 1,2,1)
  • 同一年的重复组合可能被标记为相同

在示例数据中,应如下所示:

d2 <- data.frame(id=c(1,2,3,4,5,6,7), 
            year=c(1999,1999,1999,2000,2000,2000,2000), 
            var1=c(1,1,2,1,4,1,8),
            var2=c(1,1,2,1,5,2,0),
            var3=c(0,0,0,0,7,0,0),
            comb=c(3,3,3,0,3,1,2))
> d2
  id year var1 var2 var3 comb
1  1 1999    1    1    0    3
2  2 1999    1    1    0    3
3  3 1999    2    2    0    3
4  4 2000    1    1    0    0
5  5 2000    4    5    7    3
6  6 2000    1    2    0    1
7  7 2000    8    0    0    2

请注意,第二行指定为 comb=3,因为这是我们观察到该组合的第一年。如果此观测值是 year=200(如第 4 行),则分配为零。

这可能吗?非常感谢任何帮助!

【问题讨论】:

  • 在你的输出中,第二行似乎在那一年已经存在,为什么不是0?
  • 你能在输出中写下详细的注释来描述你想要的样子吗?
  • @adiana :我想将给定年份中的每个重复观测值都标记为相同。
  • @InfiniteFlashChess :我提供了更详细的描述。这就是你发表评论的目的吗?感谢回复!
  • 我看到了问题,嗯,就像 adiana 提到的为什么不是 0?

标签: r dataframe unique


【解决方案1】:

可能有更好的方法来做到这一点,但这里有一个可能的策略。首先,您可以创建一个由var1...var3 组合而成的字符串,如下所示:

> d2$var123 <- paste(d2$var1, d2$var2, d2$var3, sep="-")
> d2
  id year var1 var2 var3 var123
1  1 1999    1    1    0  1-1-0
2  2 1999    1    1    0  1-1-0
3  3 1999    2    2    0  2-2-0
4  4 2000    1    1    0  1-1-0
5  5 2000    4    5    7  4-5-7
6  6 2000    1    2    0  1-2-0
7  7 2000    8    0    0  8-0-0

此时,您可以简单地 (1) 循环所有元素; (2) 检查var 值是否出现在var123 或所有先前var1...var3 列的列表中,然后相应地分配您的comb 值。这是一段伪代码:

d2$comb <- 0  # Initialize column
for (i in unique(d2$id)) {
    previous <- subset(d2, d2$id < i) # All the years before
    current <- subset(d2, d2$id == i) # The current row
    previous_vals <- unique(c(previous$var1, previous$var2, previous$var3)) 
    previous_combos <- unique(previous$var123)

    if (i$var1 %in% previous_vals | i$var1 %in% previous_vals... ) {
        d2$comb([d2$id==1] <- 1
    }
    if (i$var123) %in% previous_combos {
        d2$comb[d2$id==i] <- 0
    }
    .... # Rest of conditions here 
}

【讨论】:

  • previous 不仅仅是subset(d2, d2$id &lt; i),因为这样您就排除了下一行中的同年数据
  • 我明白了。也许previous 可以定义为subset(d2, d2$year &lt;= current$year &amp; d2$id != current$id)。这样,我们可以得到所有年份到current,但仍然排除current
猜你喜欢
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
相关资源
最近更新 更多