代码之家  ›  专栏  ›  技术社区  ›  karenhn

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

  •  0
  • karenhn  · 技术社区  · 2 年前

    我有一张表格,里面有样本站点的详细信息(站点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
    

    其中两行的坐标不正确,所以我试图制作两个dfs,一个只包含一个不正确的数据行,另一个包含所有其他数据,然后固定坐标并再次将表绑定在一起。

    我第一次尝试这个时使用了:

    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),]”代码时,我都会得到一个包含18个变量的0 obs.的df。

    我也试过

    temp1<-sites %>% filter(EASTING == "1528677") 
    

    但是得到相同的空df。我可以通过改变这里的东向cordinate来拉出其他任何一排,但不是那一排。我正在复制和粘贴df中的数字,所以我不明白这一行有什么特别之处。

    编辑:EASTING绝对是数字:

        > str(sites)
    'data.frame':   207 obs. of  18 variables:
     $ id              : chr  "tn20 ko A" "G01560" "Chester St" "CTK20" ...
     $ type            : chr  "bore" "bore" "bore" "bore" ...
     $ NGMP            : chr  NA NA NA NA ...
     $ LawaID          : chr  NA NA NA NA ...
     $ location        : chr  NA NA NA NA ...
     $ description     : chr  NA NA NA NA ...
     $ EASTING         : num  1692308 1683222 NA NA NA ...
    
    1 回复  |  直到 2 年前
        1
  •  0
  •   ThomasK81    2 年前

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

    对此有何回应 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,并具有5671239的NORTHING值。请注意,如果你不小心使用这样的批量方法,你真的会把数据搞砸。我希望这能有所帮助。