我有一张表格,其中包含样本站点的详细信息(站点 ID、纬度和经度、深度、直径等)。这是机密,但本质上是这样的:
id location description EASTING NORTHING depth diameter
Q111 Deal Rd Trent 2593302 6201956 3 NA
X123 Wall St NA 1602121 5602121 5 0.2
A456 Hill Rd McDonald's Farm 1604567 5604121 NA NA
D999 Mount Ave Baylis 1528677 5413458 4 0.3
其中两行的坐标不正确,因此我尝试创建两个 df,一个只有一个不正确的数据行,另一个包含所有其余数据,然后修复坐标并再次将表绑定在一起。
我第一次尝试这个时我使用了:
sites$res_num<-as.numeric(sites$EASTING)
temp1<-sites[which(sites$EASTING==2593302),]
temp2<-sites %>% filter(EASTING != "2593302" | is.na(EASTING))
temp1$EASTING<-1683222
temp1$NORTHING<-5671239
temp1$res_num<-1683222
sites<-rbind(temp1, temp2)
效果很好。 (我承认我不知道为什么我被告知要先添加额外的列)。现在我正在尝试做另一行,但是每当我尝试“temp1<-sites[which(sites$EASTING==2593302),]" code I get a df with 0 obs. of 18 variables.
我也尝试过
temp1<-sites %>% filter(EASTING == "1528677")
但得到相同的空 df。我实际上可以通过更改此处的东坐标来拉出任何其他行,但不能拉出那一行。我正在复制并粘贴 df 中的数字,所以我不明白这一行有什么特别之处。
看不到数据的数据类型和实际值会让回答变得有点困难。但我有一个怀疑:
对
typeof(sites$EASTING)
有何回应?如果是字符,我怀疑你有尾随或前导空格。看看对tibble(test_data = c("1", " 1")) |> filter(test_data == 1)
的回复。这可能也是一位同事建议您将行转换为数字的原因(请参阅 tibble(test_data = c("1", " 1")) |> mutate(test_data = as.numeric(test_data)) |> filter(test_data == 1)
的结果)。如果是这种情况,您可以使用 temp1<-sites %>% filter(res_num == "1528677")
,但我强烈建议在列上使用 str_trim 来消除多余的空白或使用数值。
顺便说一句,您当前的解决方案还会更改数据框中行的顺序。如果将 EASTING 转换为数字列,您还可以更新单个值,如下所示:
sites[which(sites$EASTING==2593302),"EASTING"] <- 1683222
然后使用 EASTING 的新值来更新 NORTHING 变量:
sites[which(sites$EASTING==1683222),"NORTHING"] <- 5671239
直接方法不会更改数据框中的顺序(但是,这两种方法都意味着所有以 2593302 作为其 EASTING 值的行都应更新为 1683222,并且 NORTHING 值为 5671239。请注意,您如果您不小心使用这样的批量方法,真的会弄乱您的数据。我希望这会有所帮助。