R:从数据帧中删除一行到新数据帧中的问题

问题描述 投票:0回答:1

我有一张表格,其中包含样本站点的详细信息(站点 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 中的数字,所以我不明白这一行有什么特别之处。

r select filter
1个回答
0
投票

看不到数据的数据类型和实际值会让回答变得有点困难。但我有一个怀疑:

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。请注意,您如果您不小心使用这样的批量方法,真的会弄乱您的数据。我希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.