我正在使用从空间网格系统获取的数据,例如划分为等间隔正方形(例如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'等价物中指定的相应单元格值(虽然在上面的例子中似乎仍然有效)。 –