2016-12-03 48 views
3

我有我的數據集,從而檢查第1列值在數據集中出現以前有不同的列值2

df <- data.frame(ID = c("m1","m2","m3","m4","m5","m6","m2","m3","m5","m6","m1","m4","m5"), 
       Year = c(1,1,1,1,1,1,2,2,2,2,3,3,3)) 

,並希望ID是否出現在上一年進行檢查。現在我有一個似乎工作的代碼

df$Check <- apply(df, 1, function(x) x["ID"] %in% df[df$Year == (as.numeric(x["Year"]) - 1), "ID"]) 

但假設我的數據集長達3百萬行,此功能需要很長的時間才能運行。有沒有更好的替代方案?

回答

4

嘗試

library(dplyr) 
dfs <- split(df$ID, df$Year); 
df$check <- unlist(mapply(`%in%`, dfs, lag(dfs))) 
+0

乾杯,偉大的工程!只需要事先一年訂購數據集 – Gowzie

+0

@Gowzie是的,您需要'df < - arrange(df,Year)'預先。讓我知道它是如何解決你的真實數據的。 – ExperimenteR

1
k = length(unique(df$Year))  # how many years in the data 
q = unique(df$Year)    # which are the years present 

func <- function(x){ 
    kk = df$ID[df$Year == q[x]]  # get the current year's ID which are present 
    kk %in% df$ID[df$Year == q[x-1]] # compare that to the previous year's ID 
} 

x <- sum(df$Year==unique(df$Year)[1]) #to know how many FALSE to be added initially 
df$check <- c(rep(FALSE, x),unlist(lapply(2:k, func))) 
+0

它幫助你@Gowzie? –

+0

不幸的是,得到「替換有20行,數據有13」的錯誤,並沒有時間查看如何解決這個問題。但由於@ExperimenteR解決方案工作得很好,我目前正在使用他的。 – Gowzie

+0

我真的很抱歉,介意我的編輯答案 –

1

您可以使用ave:每個ID,計算當前Year和前述Yeardiff)之間的差異。填充前導零。檢查結果爲1創建邏輯矢量:

df$check2 <- with(df, ave(Year, ID, FUN = function(x) c(0, diff(x))) == 1) 
# ID Year check check2 
# 1 m1 1 FALSE FALSE 
# 2 m2 1 FALSE FALSE 
# 3 m3 1 FALSE FALSE 
# 4 m4 1 FALSE FALSE 
# 5 m5 1 FALSE FALSE 
# 6 m6 1 FALSE FALSE 
# 7 m2 2 TRUE TRUE 
# 8 m3 2 TRUE TRUE 
# 9 m5 2 TRUE TRUE 
# 10 m6 2 TRUE TRUE 
# 11 m1 3 FALSE FALSE 
# 12 m4 3 FALSE FALSE 
# 13 m5 3 TRUE TRUE 

類似與data.table

對於每個IDby = ID)中,創建新的變量check2:檢查是否當前Year和前述Year之間的差中的數據是1((diff(year) == 1)),即上一年是以前的年。

library(data.table) 
setDT(df)[ , Check2 := c(FALSE, diff(Year) == 1), by = ID] 

編輯下面的評論由OP。如果「同一年同一ID的多個條目」,則對刪除了重複行的數據執行調用(unique)。然後將結果加入原始數據。

df2 <- unique(df) 
df2[ , Check2 := c(FALSE, diff(Year) == 1), by = ID] 
df[df2, on = c("ID", "Year")] 
+0

好的選擇,但在同一年有多個相同ID的條目時失敗。絕對容易解決,比我原來的解決方案快得多! – Gowzie

+0

@Gowzie感謝您的反饋。請記住總是在你的問題中構建一個具有足夠複雜性的例子。我們不介意讀者......;) – Henrik

相關問題