使用字符串向量在R中循环自定义ifelse函数

使用字符串向量在R中循环自定义ifelse函数,r,string,loops,if-statement,vector,R,String,Loops,If Statement,Vector,如果相关列中的值低于样本大小阈值,则我编写了一个函数来处理列中的NA值。如果一次应用于一个变量,该函数将起作用 # Create dataframe DF <- data.frame(VehicleType = c("Car","Car","LuxeryCar","Car","Car","LuxeryCar","LuxeryCar"), Brand = c("Honda","Audi","Bentley","Chevrolet","Hyundai","Ma

如果相关列中的值低于样本大小阈值,则我编写了一个函数来处理列中的NA值。如果一次应用于一个变量,该函数将起作用

# Create dataframe
DF <- data.frame(VehicleType = c("Car","Car","LuxeryCar","Car","Car","LuxeryCar","LuxeryCar"),
                 Brand = c("Honda","Audi","Bentley","Chevrolet","Hyundai","Maserati","Porsche"),
                 VarA_Low=c(15000, 30000, 50000, 40000, 15000, 100000, 100000),
                 VarA_Medium=c(40000, 70000, 100000, 90000, 25000, 200000, 180000),
                 VarA_High=c(20000, 150000, 500000, 190000, 80000, 1000000, 500000),
                 VarA_SampleSize=c(39,44,51,35,45,65,53),
                 VarB_Low=c(15000, 30000, 50000, 40000, 15000, 100000, 100000),
                 VarB_Medium=c(40000, 70000, 100000, 90000, 25000, 200000, 180000),
                 VarB_High=c(20000, 150000, 500000, 190000, 80000, 1000000, 500000),
                 VarB_SampleSize=c(2,40,92,47,51,39,40))

# NA values if associated SampleSize is below 40
NA_values <- function(m) {
  m <- deparse(substitute(m))
  Var_L <- paste0(as.character(m), "_Low")
  Var_M <- paste0(as.character(m), "_Medium")
  Var_H <- paste0(as.character(m), "_High")
  Count <- paste0(as.character(m), "_SampleSize")
  DF[,Var_L] <- ifelse(DF[,Count] < 40, NA, DF[,Var_L])
  DF[,Var_M] <- ifelse(DF[,Count] < 40, NA, DF[,Var_M])
  DF[,Var_H] <- ifelse(DF[,Count] < 40, NA, DF[,Var_H])
  return(DF)
}

# Apply function to one variable at a time
DF <- NA_values(VarA)
DF <- NA_values(VarB)
这是可行的,但我的解决方案是不切实际的,因为我通常有数百个变量,列名会改变,变量的数量也会改变。我想将所有变量声明为字符串向量,并将函数应用于所有变量

# Declare variables as a string vector
Vars <- c("VarA", "VarB")

# Create dataframe to store results
DF_NA <- DF

# Loop over DF and store results in DF_NA
for (item in Vars) 
{
  DF_NA[, c(item)] <- NA_values(item)
}

这会导致错误消息“undefined columns selected”

棘手的部分是您需要在一次迭代中更新数据帧中的多个列,并在下一次迭代中记住它们

有一种方法可以做到这一点:

NA_values <- function(DF, cols, sample_col) {
   DF[cols] <- lapply(cols, function(x) ifelse(DF[, sample_col] < 40, NA, DF[,x]))
   return(DF)
}

Vars <- c("VarA", "VarB")

for (item in Vars) {
  cols <- paste0(item, c("_Low", "_Medium", "_High"))
  sample_col <- paste0(item, "_SampleSize")
  DF_NA <- NA_values(DF_NA, cols, sample_col)
}

DF_NA
#  VehicleType     Brand VarA_Low VarA_Medium VarA_High VarA_SampleSize VarB_Low VarB_Medium VarB_High VarB_SampleSize
#1         Car     Honda       NA          NA        NA              39       NA          NA        NA               2
#2         Car      Audi    30000       70000    150000              44    30000       70000    150000              40
#3   LuxeryCar   Bentley    50000      100000    500000              51    50000      100000    500000              92
#4         Car Chevrolet       NA          NA        NA              35    40000       90000    190000              47
#5         Car   Hyundai    15000       25000     80000              45    15000       25000     80000              51
#6   LuxeryCar  Maserati   100000      200000   1000000              65       NA          NA        NA              39
#7   LuxeryCar   Porsche   100000      180000    500000              53   100000      180000    500000              40

请不要在你的问题中包含像rmlist=lsall.names=TRUE这样的行——没有人希望复制/粘贴/运行你的代码,并且意外地丢失他们正在处理的内容。太棒了。工作完美。