R中的ifelse语句,在表中具有不同数量的观察值

R中的ifelse语句,在表中具有不同数量的观察值,r,if-statement,R,If Statement,我有这样的数据集称为KN、ON和NH3。(但我的表有50000个观察值) 我想根据ifelse语句更改KN$low变量。(如果KN$low为NA且ON$low/NH3$low均不为NA,则将KN$low=ON$low+NH3$low设定为该特定观察值。否则,保持KN$low不变) 当我尝试运行此操作时,出现以下错误: 较长的对象长度不是较短对象长度的倍数 这是因为(我认为)ON的行数少于KN和NH3。 我表中的每个观测值都与一个站点ID相匹配,因此我认为我必须以某种方式使用该ID来为这个ifel

我有这样的数据集称为KN、ON和NH3。(但我的表有50000个观察值)

我想根据ifelse语句更改KN$low变量。(如果KN$low为NA且ON$low/NH3$low均不为NA,则将KN$low=ON$low+NH3$low设定为该特定观察值。否则,保持KN$low不变)

当我尝试运行此操作时,出现以下错误:

较长的对象长度不是较短对象长度的倍数

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

您需要使用
匹配
命令,而不是
ifelse
。我无法按照书面形式回答您的问题,因为您没有包括站点ID,但假设您的所有数据都存储在数据帧中,答案将如下所示:

KN:
high   low   calc
 1      2     3
 2      2     2
 NA     5     4
 3      3     3
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)

KN一个选项可以是使用
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

在您的示例中,行数不同,这就是您得到的警告。您是否有一个可以合并数据集的通用id?我是否先执行匹配语句,然后执行ifelse?是的,正如编写的那样,它会替换所有内容。在它周围放一个ifelse语句,只替换NAs。我刚刚尝试了这个:KN$KN\u low oops-我有KN和ON颠倒。现在试试,但我有3张桌子,KN,ON和NH3
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)
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
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