【发布时间】:2016-07-02 21:52:42
【问题描述】:
我有一个包含 5 个变量(列)的数据库。我想对数据框进行子集化,以检查是否存在某个特定列的某个值。如果是这种情况,则分配 1,否则分配 0。然后将结果(1 或 0)粘贴到受限数据框的特定列,然后继续。
数据框如下所示:
## 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
现在我想限制每年、每月和超市,并检查 Product = 65 是否存在。如果是,则为新变量(列)中限制的行分配 1。如果不是,分配0。
我尝试过使用 lapply:
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 时,我得到了“正确”的答案,但无法将结果粘贴到数据框中的正确行。
提前致谢。
【问题讨论】: