由于我或多或少是 R 的初学者,因此我遇到了以下对我来说具有挑战性的问题。
我有一个类似的 data.frame:
a b c
1 x g1 date1
2 x g1 date2
3 y g2 date3
4 y g3 date4
5 y g4 date5
6 z g1 date6
7 z g2 date7
8 x g4 date8
9 y g1 date9
10 y g3 date10
我想做的是将 a
列中的第一个值与第二个值进行比较。如果它们相同,则在 b 列中检查 g2
是否跟在 g1
之后。
数据按日期排序,我基本上想找到 g2
跟在 g1
之后的出现次数,而 a
列中的相应值> 相似。
在上面的示例数据中,总和为 1。(第 6 行和第 7 行)
最佳答案
可能有更简单的方法,但这是我的 data.table
尝试
library(data.table) ## v 1.9.6+
setDT(df)[a == shift(a, type = "lead") & b == "g1" & shift(b, type = "lead") == "g2", .N]
## [1] 1
这基本上是将 a
与移位后的 a
列进行比较,同时检查 b
列是否等于 g1
并且移动后的 b
列等于 g2
。您将需要 CRAN 上的最新 data.table
版本才能使其正常工作。
使用 dplyr
它可以是这些行中的东西
library(dplyr)
df %>%
filter(a == lead(a) & b == "g1" & lead(b) == "g2") %>%
count()
# Source: local data table [1 x 1]
#
# n
# (int)
# 1 1
或以 R 为基数
sum(with(df, a == c(tail(as.character(a), -1), NA) & b == "g1" & c(tail(as.character(b), -1), NA) == "g2"))
## [1] 1
关于R 跨行比较列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33146552/