R使用字符串检索数据列

R使用字符串检索数据列,r,character,data-retrieval,R,Character,Data Retrieval,我正在努力做一些看起来简单的事情;但我已经坚持了很长一段时间了 我有一个data.frame很长,但这里有一个示例可以代表它 my.dataframe<-data.frame(PointA.X=sample(100,4)) my.dataframe$PointA.Y<-sample(100,4) my.dataframe$PointB.X<-sample(100,4) my.dataframe$PointB.Y<-sample(100,4) PointA.X

我正在努力做一些看起来简单的事情;但我已经坚持了很长一段时间了

我有一个data.frame很长,但这里有一个示例可以代表它

my.dataframe<-data.frame(PointA.X=sample(100,4))
my.dataframe$PointA.Y<-sample(100,4)
my.dataframe$PointB.X<-sample(100,4)
my.dataframe$PointB.Y<-sample(100,4)

     PointA.X PointA.Y PointB.X PointB.Y
1       93       98       46       45
2       58        3       80       89
3       61       64       17       14
4       56       46       65       23
以下

as.character(paste0("Mydataframe$" , Start , ".X")) 
返回

"Mydataframe$PointA.X"
哪个是我的数据框中的有效列 使用get()查找对象,而不是实际数据

这就是我被困的地方。是否有一个函数用于返回我要查找的值

提前谢谢大家

试试这个。这可能会有帮助。
Try this. It may help.


MyFunction<-function(Start, End){
XStart <- eval(parse(text=paste("my.dataframe$",Start,".X", sep = "")))
XEnd   <- eval(parse(text=paste("my.dataframe$",End,".X", sep = "")))
YStart <- eval(parse(text=paste("my.dataframe$",Start,".Y", sep = "")))
YEnd   <- eval(parse(text=paste("my.dataframe$",End,".Y", sep = "")))
sqrt(((XStart - XEnd) ^ 2 + (YStart - YEnd) ^ 2))
}

MyFunction正如Richard所建议的,可以使用字符串将数据帧子集放到括号[[]]中,但不能使用$符号

所以对未来的建议是:使用括号

  MyFunction<-function(Start, End){
  XStart <- my.dataframe[[paste0(Start, ".X")]]
  YStart <- my.dataframe[[paste0(Start, ".Y")]]

  XEnd <- my.dataframe[[paste0(End, ".X")]]
  YEnd <- my.dataframe[[paste0(End, ".Y")]]

  sqrt(((XStart - XEnd) ^ 2 + (YStart - YEnd) ^ 2))
} # End of My Function

MyFunction("PointA", "PointB") # Note the arguments are provided as characters
> [1] 39.20459 80.52950 34.17601  6.00000
我想我只是错过了要点。 我可能会使用combine函数来解决这个问题

 combn(colnames(my.dataframe), 2)

    [,1]       [,2]       [,3]       [,4]       [,5]       [,6]       [,7]       [,8]       [,9]       [,10]     
[1,] "PointA.X" "PointA.X" "PointA.X" "PointA.X" "PointA.X" "PointA.Y" "PointA.Y" "PointA.Y" "PointA.Y" "PointB.X"
[2,] "PointA.Y" "PointB.X" "PointB.Y" "PointC.X" "PointC.Y" "PointB.X" "PointB.Y" "PointC.X" "PointC.Y" "PointB.Y"
     [,11]      [,12]      [,13]      [,14]      [,15]     
[1,] "PointB.X" "PointB.X" "PointB.Y" "PointB.Y" "PointC.X"
[2,] "PointC.X" "PointC.Y" "PointC.X" "PointC.Y" "PointC.Y"

没错
get()
查找对象<代码>“Mydataframe$PointA.X”
不是对象
Mydataframe
是一个对象,PointA.X是该对象中的一列。但是
“Mydataframe$PointA.X”
不是对象的名称,这是
get()
想要的参数名称。但你为什么要这样做?您只需使用Mydataframe[[paste0(Start,.X”)]等即可。嗨,Richard,谢谢您的回复。那是个好主意。我试图缩短我的代码,因为我有100个列,我会计算它们的长度。。
  MyFunction<-function(Start, End){
  XStart <- my.dataframe[[paste0(Start, ".X")]]
  YStart <- my.dataframe[[paste0(Start, ".Y")]]

  XEnd <- my.dataframe[[paste0(End, ".X")]]
  YEnd <- my.dataframe[[paste0(End, ".Y")]]

  sqrt(((XStart - XEnd) ^ 2 + (YStart - YEnd) ^ 2))
} # End of My Function

MyFunction("PointA", "PointB") # Note the arguments are provided as characters
> [1] 39.20459 80.52950 34.17601  6.00000
my.dataframe<-data.frame(PointA.X=sample(100,4))
my.dataframe$PointA.Y<-sample(100,4)
my.dataframe$PointB.X<-sample(100,4)
my.dataframe$PointB.Y<-sample(100,4)
my.dataframe$PointC.X<-sample(100,4)
my.dataframe$PointC.Y<-sample(100,4)
MyFunction<-function(Start, End){
XStart <- my.dataframe[[paste0(Start, ".X")]]
YStart <- my.dataframe[[paste0(Start, ".Y")]]

XEnd <- my.dataframe[[paste0(End, ".X")]]
YEnd <- my.dataframe[[paste0(End, ".Y")]]

sqrt(((XStart - XEnd) ^ 2 + (YStart - YEnd) ^ 2))
} # End of My Function
for (VariableI in seq(from=1, to=length(colnames(my.dataframe)), by=2)){
Start<-unlist(strsplit(colnames(my.dataframe)[VariableI], "[.]"))[1]
End<-unlist(strsplit(colnames(my.dataframe)[VariableI+2], "[.]"))[1]
assign(paste0(Start,End), MyFunction(Start, End)) 
}
 PointAPointB
    [1] 32.57299 74.30343 73.08215 83.25863
    PointBPointC
    [1]  5.385165 90.609050 68.883960 58.137767
 combn(colnames(my.dataframe), 2)

    [,1]       [,2]       [,3]       [,4]       [,5]       [,6]       [,7]       [,8]       [,9]       [,10]     
[1,] "PointA.X" "PointA.X" "PointA.X" "PointA.X" "PointA.X" "PointA.Y" "PointA.Y" "PointA.Y" "PointA.Y" "PointB.X"
[2,] "PointA.Y" "PointB.X" "PointB.Y" "PointC.X" "PointC.Y" "PointB.X" "PointB.Y" "PointC.X" "PointC.Y" "PointB.Y"
     [,11]      [,12]      [,13]      [,14]      [,15]     
[1,] "PointB.X" "PointB.X" "PointB.Y" "PointB.Y" "PointC.X"
[2,] "PointC.X" "PointC.Y" "PointC.X" "PointC.Y" "PointC.Y"