【问题标题】:R: Processing data in columns using if statements with grepl conditioningR:使用带有 grepl 条件的 if 语句处理列中的数据
【发布时间】:2019-11-24 04:16:22
【问题描述】:
longtidue <- c('517W', '595W', '433W', '450E', '659E', '682W', '678W', '546E', '462W', '500W')
latitude <- c('291N','202N', '276N', '269S', '279N', '294N', '252N', '254S', '248N', '258N')
df <- data.frame(latitude, longitude)

是我正在使用的数据库示例,它处理以以下格式显示的经纬度坐标:

240N、707W、267S、130E

我需要处理这些坐标,以便它们可以在采用以下形式的坐标的模型中使用:

24.0, -70.7, -26.7, 13.0

(在模型中,北和东被认为是正方向。)

目标是能够遍历整个列,并确定单元格中是否存在“N”或“S”。从那里我想删除字母,然后将剩余的数字除以 10 或 -10 以给出正确的符号。如果列中既没有出现 N 也没有出现 S,我希望代码单独保留单元格,这就是我在下面发布的示例代码末尾的 else 语句的原因。为了处理列中的所有数据,我尝试使用 elseif 语句,但我不确定如何让它工作。我最终进入了一个 if 条件如下所示的 for 循环:

for (i in 1:nrow(df)) {
  if (grepl("N",df$latitude, fixed = TRUE)) {

    df$latitude <- gsub("N", "",df$latitude) & df$latitude <- df$latitude/(10)

   } else if (grepl("S",df$latitude, fixed = TRUE)) {

    df$latitude <- gsub("S", "",df$latitude) & df$latitude <- as.numeric(df$latitude) & df$latitude <- df$latitude/(-10)

   } else (df$latitude)
}

但这要么给我一个错误,df$latitude/(10) 说“非数字参数到二元运算符”从数据从字符转换为数字(?)和/或警告“条件的长度 > 1,并且只会使用第一个元素”。我对 R 和堆栈溢出也很陌生,所以如果我的代码可以更好地格式化,请告诉我。

提前致谢!

【问题讨论】:

  • 作为一般规则,如果您循环遍历i 并且不要在循环内使用i,那就有问题了。

标签: r if-statement grepl


【解决方案1】:

这是一个基本的 R 选项。首先,我们可以通过剥离最后一个方向字符,转换为数字,然后除以 10 来计算纬度/经度值的绝对值。然后,我们有条件地翻转西向和南向的符号。

lng <- as.numeric(sub(".$", "", longitude)) / 10
lng <- ifelse(grepl("[WS]$", longitude), -1.0, 1.0) * lng
lng

[1] -51.7 -59.5 -43.3  45.0  65.9 -68.2 -67.8  54.6 -46.2 -50.0

数据:

longitude <- c('517W', '595W', '433W', '450E', '659E', '682W', '678W', '546E', '462W', '500W')

【讨论】:

    【解决方案2】:

    你有几个问题:

    • 正如我在 cmets 中提到的,您将 i1 循环到 nrow(df)。但是你没有在循环中提到i,所以你一次又一次地在相同的输入上运行相同的代码。要成功使用for 循环,您需要在其中有一堆[i]s,以一次处理每个输入和输出。

    • 1234563 - 要么全有,要么全无。
    • 你似乎对&amp; 有很大的误解。这行代码没有意义:df$latitude &lt;- gsub("N", "",df$latitude) &amp; df$latitude &lt;- df$latitude/(10),它是用&amp; 连接在一起的两条单独的行。 A &amp; B 并不意味着“做A 和做B”,它的意思是“检查AB 是否都为真。如果是则返回TRUE,否则返回FALSE。如果你想先做A,然后再做B,只需将A放在一行,B放在下一行

    好的解决方案而言,在我写这篇文章的时候,您已经从 Tim 那里收到了一个不错的、简短的、矢量化(不需要循环)的解决方案。就这么做吧。

    【讨论】:

    • 我认为 for 循环是最好的,因为我拥有的最接近这个问题的最佳示例是我今年早些时候编写的索引数据帧替换代码,但是您对 for 循环的澄清以及“&”符号如何与之交互有助于解释为什么它不起作用。感谢您的进一步澄清!
    猜你喜欢
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 2021-01-10
    • 2021-11-09
    • 2017-03-04
    • 1970-01-01
    相关资源
    最近更新 更多