我有一個包含5個變量(列)的數據庫。我想要子集數據框,以檢查是否存在某個特定列的某個值。如果是這種情況,則分配1,否則爲0.然後將結果(1或0)粘貼到受限數據框的特定列,然後繼續。如何將lapply或for循環的結果添加到特定行
數據幀如下所示:
## Year Month Product Supermarket Price
## 2015 1 67 1 10
## 2015 1 65 1 11
## 2015 1 69 1 15
## 2015 2 65 2 20
## 2015 2 67 2 25
## 2015 2 67 3 15
## 2015 2 69 3 12
現在我想限制每個年份,月份和超市,並檢查產品= 65是存在的。如果是,則爲在新變量(列)中限制的行分配1。如果沒有,用lapply分配0
我曾嘗試:
prueba <- function(x)
ifelse(any(base$Product == 65), 1, 0)
lapply(unique(base$Supermarket) & unique(base$Year) & unique(base$Month),
base$NewVar <- prueba)
,但有以下結果
Error in rep(value, length.out = nrows) :
attempt to replicate an object of type 'closure'
接下來,我嘗試做一個for循環:
for(i in unique(base$Supermarket)) {
for(j in unique(base$Year))
for(h in unique(base$Month)) {
try <- ifelse(any((filter(base, Supermarket == i, Year == j, Month == h))$Product == 65), 1, 0)
base[base$Supermarket == i && base$Year ==j && base$Month == h,]$NewVar <- try
}
}
}
並有如下結果:
Error in if (nrow(try) == 0) { : argument has zero lenght
我應該說數據庫有5000萬行,所以速度是一個問題在這裏(所以我嘗試使用lapply而不是for循環) 我不知道如何獲得正確的結果,這應該是像如下:
## Year Month Product Supermarket Price NewVar
## 2015 1 67 1 10 1
## 2015 1 65 1 11 1
## 2015 1 69 1 15 1
## 2015 2 65 2 20 1
## 2015 2 67 2 25 1
## 2015 2 67 3 15 0
## 2015 2 69 3 12 0
不知道如何解決整個問題。當使用lapply時,我得到了「正確」的答案,但是無法將結果粘貼到數據框的正確行中。
在此先感謝。
謝謝,@akrun。只是要知道,爲什麼要包含產品?另外,在這個環境中做什麼(看幫助,並說它評估一個R表達式,美麗而簡單。 –
@LeandroZipitria在第一個產品之後,所有其他變量都是分組變量,所以'x'是指產品'.''用於我們不需要使用'df1 $ Product','df1 $ Year'等,這會變得更羅嗦。 – akrun
感謝您的時間。我學到了很多東西。 –