我有以下问题对我很有挑战性,因为我或多或少是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行)
答案 0 :(得分:3)
可能有一种更简单的方法,但这是我的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
列等于{ {1}}。您需要在CRAN上使用最新的g2
版本才能实现此目的。
使用data.table
可以在这些行中添加某些内容
dplyr
或者用基础R
library(dplyr)
df %>%
filter(a == lead(a) & b == "g1" & lead(b) == "g2") %>%
count()
# Source: local data table [1 x 1]
#
# n
# (int)
# 1 1
答案 1 :(得分:2)
替代方案:
数据:
df <- read.table(header=T, text=' 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', stringsAsFactors=F)
解决方案:
library(dplyr) #for lag
#df$a == lag(df$a) checks the equality in consecutive rows in a
#the rest of the code checks the order of g2 and g1 in consecutive rows
df$out <- df$a == lag(df$a) & grepl(paste('g2','g1'), paste(df$b, lag(df$b)))
输出:
> df
a b c out
1 x g1 date1 FALSE
2 x g1 date2 FALSE
3 y g2 date3 FALSE
4 y g3 date4 FALSE
5 y g4 date5 FALSE
6 z g1 date6 FALSE
7 z g2 date7 TRUE
8 x g4 date8 FALSE
9 y g1 date9 FALSE
10 y g3 date10 FALSE
并且
sum(df$out)
[1] 1
答案 2 :(得分:1)
你可以这样做。
result <- NULL
for (i in 1:NROW(df)){result <- c(result, df$a[i]==df$a[i-1] & df$b[i]=="g2" & df$b[i-1]=="g1")}
length(which(result))
# [1] 1
这是数据。
a <- c("x", "x", "y", "y", "y", "z", "z", "x", "y", "y")
b <- c("g1", "g1", "g2", "g3", "g4", "g1", "g2", "g4", "g1", "g3")
c <- paste("date", 1:10, sep = "")
df <- as.data.frame(cbind(a,b,c))