Есть способ, но он может быстро запутаться в зависимости от того, как названы столбцы.
Я предпочитаю динамически кодировать, используя следующее выражение
eval(parse(text = p.text))
где p.text - это строка кода, которую я хочу запустить.
Поэтому, когда у меня есть строка, которую я хотел бы выполнить динамически, возникает ряд условий, которые мне нужно выполнить в первую очередь. А именно, мне понадобится функция, которая будет надежно создавать объект p.text для имитации вашей строки кода
data_file$V2[data_file$V2 == "."] <- paste(data_file$V1[data_file$V2 == "."],
data_file$V4[data_file$V2 == "."], sep = "_")
Самый простой способ использовать индексы с моим ответом будет следующим:
#Get column names
cNam <- colnames(file)
#Assume cNam is c("V1","V2","V3","V4","V5")
#Build p.text
p.text <- paste(sep = "",
"file$",
cNam[2],
"[file$",
cNam[2],
"==\".\"] <- paste(file$",
cNam[1],
"[file$",
cNam[2],
"==\".\"], file$",
cNam[4],
"[file$",
cNam[2],
"==\".\"], sep = \"_\")")
p.text
# [1] "file$V2[file$V2==\".\"] <- paste(file$V1[file$V2==\".\"], file$V4[file$V2==\".\"], sep = \"_\")"
eval(parse(text = p.text))
Но опять же, это очень грязно и может легко сломаться, если вы не считаете, что некоторые имена столбцов могут содержать пробелы и другие символы, для работы которых требуются экранирующие метки. Таким образом, у вас может быть вспомогательная функция для обтекания любой переменной, в которой хранятся имена столбцов, которые будут возвращать имена столбцов с этими метками, чтобы они правильно вызывались в нотации. Как это
parseFriendly <- function(x) {
x <- ifelse(stringr::str_detect(string = x, pattern = " "), paste(sep = "", "`",x,"`"), x )
}
#there are a number of special characters that require checking for besides spaces
#Such as: ?, +, -, /, #, =, @, !, %, ^, &, *, (, ),:
#basically almost anything that isnt a letter or a number excluding _ and .
#But spaces are the most common
Этот код также позволит вам динамически работать с именами файлов. (если вы хотите действительно сойти с ума по этому поводу)
#Store File variable name
fNam <- "My_new_file"
#Get column names
cNam <- eval(parse( text = paste(sep = "", "colnames(",fNam,")")))
#Assume cNam is c("bull dog","Poodle","Pug","Beagle","Boxer")
#Build p.text
p.text <- paste(sep = "",
fNam, "$",
parseFriendly(cNam[2]),
"[",fNam, "$",
parseFriendly(cNam[2]),
"==\".\"] <- paste(",fNam, "$",
parseFriendly(cNam[1]),
"[",fNam,"$",
parseFriendly(cNam[2]),
"==\".\"], ",fNam,"$",
parseFriendly(cNam[4]),
"[",fNam,"$",
parseFriendly(cNam[2]),
"==\".\"], sep = \"_\")")
p.text
# [1] "my_new_file$Poodle[my_new_file$Poodle==\".\"] <- paste(my_new_file$`bull dog`[my_new_file$Poodle==\".\"], my_new_file$Beagle[my_new_file$Poodle==\".\"], sep = \"_\")"
Я много писал, но я надеюсь, что это даст вам представление о том, как кодировать динамически.