我的数据集看起来像是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语句配对观察(因为我不能通过观察数来做,因为每个表有一个不同的测量数量)
答案 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