如果在另一列中为False,如何使列值为负

时间:2018-10-20 13:34:13

标签: r

我已经搜索了很多,但是似乎无法找到解决我问题的方法。

这是我们正在谈论的数据集:

   NS    WE  LatCopy  LongCopy
FALSE FALSE 48.89328  5.803433
TRUE  FALSE 48.55725  6.877400
TRUE  FALSE 48.39922  9.383667
FALSE TRUE  48.37538  9.517017
TRUE  FALSE 48.20710 12.324067
TRUE  TRUE  48.16878 12.822067

由于这些是坐标,因此我必须取消风向才能将其转换为十进制度数。但是,我现在没有-指示器。

我正在寻找的结果是这样的:

   NS    WE  LatCopy  LongCopy
FALSE FALSE 48.89328 -5.803433
TRUE  FALSE 48.55725 -6.877400
TRUE  FALSE 48.39922 -9.383667
FALSE TRUE -48.37538  9.517017
TRUE  FALSE 48.20710 -12.32406
TRUE  TRUE 48.16878 -12.82206

数据

df <- read.table(text="NS    WE  LatCopy  LongCopy
FALSE FALSE 48.89328  5.803433
TRUE  FALSE 48.55725  6.877400
TRUE  FALSE 48.39922  9.383667
FALSE TRUE  48.37538  9.517017
TRUE  FALSE 48.20710 12.324067
TRUE  TRUE  48.16878 12.822067",h=T)

3 个答案:

答案 0 :(得分:1)

您也可以稍作调整使用sign

df[c("LongCopy", "LatCopy")]  <- 
  df[c("LongCopy", "LatCopy")] * sign(.5-df[c("NS","WE")]) # or `2*` instead of sign
#      NS    WE   LatCopy   LongCopy
# 1  TRUE FALSE  48.89328  -5.803433
# 2  TRUE FALSE  48.55725  -6.877400
# 3  TRUE FALSE  48.39922  -9.383667
# 4 FALSE  TRUE -48.37538   9.517017
# 5  TRUE FALSE  48.20710 -12.324067
# 6  TRUE FALSE  48.16878 -12.822067

答案 1 :(得分:1)

只有一种可能性,dplyr解决方案:

data %>%
  mutate(LatCopy = ifelse(NS, LatCopy, -LatCopy),
         LongCopy = ifelse(WE, LongCopy, -LongCopy))

一种data.table解决方案:

setDT(data)[, LatCopy := ifelse(NS, LatCopy, -LatCopy)
            ][, LongCopy := ifelse(WE, LongCopy, -LongCopy)]

答案 2 :(得分:0)

dataframe$LatCopy  <- ifelse(dataframe$WE == TRUE, -dataframe$LatCopy, dataframe$LatCopy)
dataframe$LongCopy <- ifelse(dataframe$NS == TRUE, -dataframe$LongCopy , dataframe$LongCopy )

您可以尝试这样的事情吗?我没有打开R,所以我无法对其进行测试,但这是我要开始的地方。