我正在使用從空間網格系統獲取的數據,例如劃分爲等間隔正方形(例如250平方米的單元格)的城市。每個單元格都擁有一個唯一的列和行號,以及與這個250平方米內包含的區域相關的數字信息(比如整個城市中每個單元格的溫度)。在整個網格部分(或示例城市)內,我有各種研究網站,並且知道它們位於何處(即每個網站所在的單元格行和列)。我有一個數據框,其中包含城市內所有單元的信息,但我想將其子集僅包含來自我的研究站點所在單元的信息。我以前問過這個'Matching information from different dataframes and filtering out redundant columns'的問題。下面是一些示例代碼:基於來自兩個獨立數據框的值對列進行子集化的問題
###Dataframe showing cell values for my own study sites
Site <- as.data.frame(c("Site.A","Site.B","Site.C"))
Row <- as.data.frame(c(1,2,3))
Column <- as.data.frame(c(5,4,3))
df1 <- cbind(Site,Row, Column)
colnames(df1) <- c("Site","Row","Column")
###Dataframe showing information from ALL cells
eg1 <- rbind(c(1,2,3,4,5),c(5,4,3,2,1)) ##Cell rows and columns
eg2 <- as.data.frame(matrix(sample(0:50, 15*10, replace=TRUE), ncol=5)) ##Numerical information
df2 <- rbind(eg1,eg2)
rownames(df2)[1:2] <- c("Row","Column")
從這個,我用前面的問題的答案完美的示例數據。
output <- df2[, (df2['Row', ] %in% df1$Row) & (df2['Column', ] %in% df1$Column)]
names(output) <- df1$Site[mapply(function(r, c){which(r == df1$Row & c == df1$Column)}, output[1,], output[2,])]
但是,我不能將它應用到我自己的數據,並不能找出原因。
編輯:最初,我以爲有列命名的問題(即'名稱'功能)。但是看起來可能會出現'output'行代碼的問題,即df2中包含的列不應該是(即輸出包含來自df2的列,其列和行號在df1中未指定)。
我也曾嘗試:
output <- df2[, (df2['Row', ] == df1$Row) & (df2['Column', ] == df1$Column)]
但是用我自己的(貌似可比)數據時,我沒有得到從「DF1」相當於規定的所有單元的信息(雖然在再次工作正常上面的示例數據)。如果我單獨進行每個研究網站,我可以獲得自己的數據。
SiteA <- df2[, which(df2['Row', ] == 1) & (df2['Column', ] == 5)]
SiteB <- df2[, which(df2['Row', ] == 2) & (df2['Column', ] == 4)]
SiteC <- df2[, which(df2['Row', ] == 3) & (df2['Column', ] == 3)]
但我有1000多個網站,並希望有一個更簡潔的方法。我確信我保持了相同的結構,雙重檢查拼寫和變量名稱。任何人都能夠對我可能做錯的潛在事情發表任何意見嗎?或者失敗這個替代方法?沒有爲實際問題提供示例代碼(我希望我能指出具體問題是什麼,但在此之前原始示例是我能做到的最好的例子)!謝謝。
我現在所能說的就是'names()'期待一個字符向量,其中包含儘可能多的元素作爲'output'shas列。如果不是這種情況,這一行會拋出一個錯誤。 https://stat.ethz.ch/R-manual/R-devel/library/base/html/names.html – nilsole
您可能希望將'mapply'包裹在'unlist'周圍,因爲它返回一個'list',並且你想要一個'vector':'''output < - df2 [,(df2 ['Row',]%in%df1 $ Row)&(df2 ['Column',]%in%df1 $ Column)]; (輸出)< - df1 $ Site [unlist(mapply(function(r,c){which(r == df1 $ Row&c == df1 $ Column)},output [1,],output [2, ]))]'''。 – Abdou
謝謝你的迴應。但是,我曾嘗試向'df2'添加重複列(這可能與我自己的數據有關),但代碼在該示例中仍可正常運行。我嘗試了unlisting,但是這並沒有爲我自己的數據賦予適當的列名到'df1'等價物中指定的相應單元格值(雖然在上面的例子中似乎仍然有效)。 –