R中的ifelse语句,表中有不同的观察数

时间:2018-04-17 17:38:30

标签: r if-statement

我的数据集看起来像是KN,ON和NH3。 (我的表有50000个观察结果)

KN:
high  low   calc
 1     2     3
 2     2     2
NA     NA    4
 3     3     3

ON
high   low   calc
 1      2      3
 2      2      2
 2      2      2


NH3
high   low   calc
 1      1      1
 2      2      2
 3      3      3
 4      4      4

我想根据这个ifelse语句更改我的KN $ low变量。 (如果KN $ low为NA且ON $ low / NH3 $ low都不是NA,那么对于该特定观察,使KN $ low = ON $ low + NH3 $ low。否则,保持KN $为低)

KN$low <- ifelse(is.na(KN$low) & !is.na(ON$low) & !is.na(NH3$low), ON$low + NH3$low, KN$low)

所以我希望我的输出看起来像这样:

KN:
high   low   calc
 1      2     3
 2      2     2
 NA     5     4
 3      3     3

当我尝试运行时,我收到此错误:

  

较长的物体长度不是较短物体长度的倍数

这是因为(我认为)ON的行数少于KN和NH3。 我的表中的每个观察都与一个站ID相匹配,所以我认为我必须以某种方式使用它来对这个ifelse语句配对观察(因为我不能通过观察数来做,因为每个表有一个不同的测量数量)

2 个答案:

答案 0 :(得分:0)

您需要使用match命令而不是ifelse。我无法真正回答您的问题,因为您没有包含电台ID,但假设您的所有数据都存储在数据框中,答案将如下所示:

KN <- within(KN, {
  ON_low <- ON$low[match(KN$station_id, ON$station_id)]
  NH3_low <- NH3_low[match(KN$station_id, NH3_low)]
  low <- ifelse(is.na(low), ON_low + NH3_low, KN$low)
  rm(ON_low, NH3_low)

})

答案 1 :(得分:0)

选项可以是apply

KN$low <- mapply(function(x){
      val = NA
      if(is.na(KN$low[x]) & !is.na(ON$low[x]) & !is.na(NH3$low[x]) ){
        val = ON$low[x] + NH3$low[x]
      }else{
        val = KN$low[x]
      }},1:nrow(KN))

KN
#   high low calc
# 1    1   2    3
# 2    2   2    2
# 3   NA   5    4
# 4    3   3    3

由于有50K +行,因此基于dplyr的解决方案可以是:

library(dplyr)


KN %>% mutate(rn = row_number()) %>%
  left_join(mutate(ON, rn = row_number()), by="rn") %>%
  left_join(mutate(NH3, rn = row_number()), by="rn") %>%
  mutate(low.x = ifelse(is.na(low.x) & !is.na(low.y) & !is.na(low), low.y+low, low.x )) %>%
  select(high = high.x, low = low.x, calc = calc.x )
#   high low calc
# 1    1   2    3
# 2    2   2    2
# 3   NA   5    4
# 4    3   3    3