r - 使用字符串向量在 R 中循环自定义 ifelse 函数
问题描述
如果相关列中的值低于样本大小阈值,我将函数写入列中的 NA 值。如果一次应用于 1 个变量,该函数将起作用。
# 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)
}
这会导致错误消息“选择了未定义的列”
解决方案
棘手的部分是您需要在一次迭代中更新数据框中的多个列,并在下一次迭代中“记住”它们。
这是一种方法:
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
推荐阅读
- java - Java:使用列表映射 POST 正文
- javascript - 是否可以在不使用文件路径 src 的情况下插入图像?
- c++ - 如何推导出 std::advance 迭代器类型?
- css - Sidenav 中的右对齐开关
- c# - xamarin 表单 - 使用 c# 计算图像源的尺寸
- arrays - 数组有元素但长度为 0
- javascript - 我确实知道如何解决语言/音频问题,但我不知道如何将它组合成代码
- sql - 如何在 SQL Server 中减去当前值和以前的值
- android - 以编程方式将recyleview的三项放在屏幕中
- java - 如何获取文本文件中每个字符的坐标?