簡體   English   中英

R使用字符串來檢索數據列

[英]R use a character string to retrieve data column

我正在努力尋找一些看起來很簡單的東西; 但是我已經堅持了很長時間。

我有一個很長的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

我正在尋找一個使用兩個參數的函數,從中將出現更多的參數。

MyFunction<-function(Start, End){
XStart <- get(as.character(paste0("Mydataframe$" , Start , ".X")))
XEnd   <- get(as.character(paste0("Mydataframe$" , End   , ".X")))
YStart <- get(as.character(paste0("Mydataframe$" , Start , ".Y")))
YEnd   <- get(as.character(paste0("Mydataframe$" , End   , ".Y" )))
sqrt(((XStart - XEnd) ^ 2 + (YStart - YEnd) ^ 2))
} # End of My Function

在這種情況下,我將定義起點和終點以計算它們之間的線段長度。 MyFunction(“ PointA”,“ PointB”)

據我了解

MyFunction("PointA", "PointB")

下列

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))
}

正如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

更有趣的是,我還可以跨列名稱循環該函數。 因此,如果數據報更長。

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循環:

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

我想我只是想念PointAPointC。 我可能會使用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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM