R:为每一行计算满足某些条件的“相似”行的数量

时间:2016-04-11 23:13:07

标签: r data.table

假设我有以下数据表

    x y   z
 1: 1 1 100
 2: 1 1 100
 3: 1 1 100
 4: 1 2 200
 5: 1 2 100
 6: 1 2 100
 7: 2 1 200
 8: 2 1 200
 9: 2 1 100
10: 2 2 200
11: 2 2 200
12: 2 2 200

DT = setDT(structure(list(x = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L, 2L), y = c(1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L
), z = c(100, 100, 100, 200, 100, 100, 200, 200, 100, 200, 200, 
200)), .Names = c("x", "y", "z"), row.names = c(NA, -12L), class = "data.frame"))

我需要创建一个新列,对于每一行,计算特定给定值(100)出现在列z中的特定组合x,y的数量(这就是我所指的“类似的行“)。实际上,我需要这样做两次,因为我需要为z中的每个可能值添加一个新列,即100和200.

结果数据表应如下所示:

    x y   z hundred two_hundred
 1: 1 1 100       3           0
 2: 1 1 100       3           0
 3: 1 1 100       3           0
 4: 1 2 200       2           1
 5: 1 2 100       2           1
 6: 1 2 100       2           1
 7: 2 1 200       1           2
 8: 2 1 200       1           2
 9: 2 1 100       1           2
10: 2 2 200       0           3
11: 2 2 200       0           3
12: 2 2 200       0           3

请注意,共享相同x和y组合的所有行也将在列100和two_hundred中共享相同的值,而不管它们在z中的值。

此外,我需要摆脱冗余行和列z,以便我有一个更短的数据表。

DT <- DT %>% unique(by=c("x","y"))
DT [,z:=NULL]

最终产品将是:

   x y hundred two_hundred
1: 1 1       3           0
2: 1 2       2           1
3: 2 1       1           2
4: 2 2       0           3

哪种方法最简单?如果冗余行的计数和删除都可以通过一个命令完成,那将会很有趣。

(请尽可能使用dplyr命令)

我是R的编程新手,所以如果你们能给我一个简单的语言回答,我将不胜感激,因为我还没有熟悉R中所有最常见的结构和程序(从周期的过渡 - 就像在Java中以矩阵方式使用Java算法一直非常艰难......)

提前致谢。这也是我在本网站的第一个问题。

0 个答案:

没有答案