我有一段代码检查数据帧,并将条件列V2
和V1
的连接值有条件地替换列V4
的值,如果列{{1} }
所以我的代码是:
V2 == "."
并将其应用于这样的数据框时:
data_file$V2[data_file$V2 == "."] = paste(data_file$V1[data_file$V2 == "."], data_file$V4[data_file$V2 == "."], sep = "_")
输出看起来像这样:
V1 V2 V3 V4 V5 V6
1 rs796086906 0 13868 G A
1 . 0 14354 A C
1 rs62635297 0 14653 T C
1 . 0 14907 G A
那么我的问题基本上是学术性的。由于此代码依赖于提前知道列名(并且当遍历多个文件时,也依赖于具有相同名称的列),我想知道是否有一种方法可以执行相同的操作,但要通过其编号来调用列。 / p>
遵循这些原则:
V1 V2 V3 V4 V5 V6
1 rs796086906 0 13868 G A
1 1_14354 0 14354 A C
1 rs62635297 0 14653 T C
1 1_14907 0 14907 G A
但是,这段特定的代码不起作用。
这真的可能吗,或者这是没有意义的练习?
答案 0 :(得分:1)
有一种方法,但是根据列的命名方式,它可能很快变得混乱。 我更喜欢动态编码,是使用以下表达式
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 = \"_\")"
我写了很多书,但是我希望这能给您一个关于如何动态编码的想法。