我正在尝试根据另一列中的值添加一个新列。(基本上如果另一列缺失或为0,则将新值设置为0或1)
下面这段代码有什么问题?
times=nrow(eachfile)
for(i in 1:times)
{eachfile$SalesCycleN0[i] <- ifelse(eachfile$R[i]==NA | eachfile$R[i]==0,0,1 ) }
table(eachfile$SalesCycleN0)
我正在尝试根据另一列中的值添加一个新列。(基本上如果另一列缺失或为0,则将新值设置为0或1)
下面这段代码有什么问题?
times=nrow(eachfile)
for(i in 1:times)
{eachfile$SalesCycleN0[i] <- ifelse(eachfile$R[i]==NA | eachfile$R[i]==0,0,1 ) }
table(eachfile$SalesCycleN0)
只要您测试过该列仅包含 0、1 和 NA,我就会这样做:
eachfile$SalesCycleN0 <- 1
eachfile$SalesCycleN0[is.na(eachfile$R) | eachfile$R==0] <- 0
一种更有效的方法是使用sapply
函数,而不是使用for
循环(在巨大数据集的情况下很方便)。这是一个例子:
df = data.frame(x = c(1,2,0,NA,5))
fun = function(i) {is.na(df$x[i]) || (df$x[i] == 0)}
bin <- (sapply(1:nrow(df), FUN = fun))*1 ## multiplying by 1 will convert the logical vector to a binary one.
df <- cbind(df, bin)
在你的情况下:
fun = function(i) {is.na(eachfile$SalesCycleNO[i]) || (eachfile$SalesCycleNO[i] == 0)}
bin <- (sapply(1:times, FUN = fun))*1
eachfile <- cbind(eachfile, bin)
对 NA 来说,什么都不是“==”。只需这样做(无循环):
eachfile$SalesCycleN0 <- ifelse( is.na(eachfile$R) | eachfile$R==0, 0,1 )
如果您正在寻找更经济的代码,这也可能有效:
eachfile$SalesCycleN0 <- as.numeric( !grepl("^0$", eachfile$R) )
grepl
为 NA 返回 FALSE。