R 同时填充2个数据帧列?

R 同时填充2个数据帧列?,r,dataframe,R,Dataframe,我有一个数据框,每行最多有4对不同的地理坐标。包含它们的字段是LAT1和LONG1、LAT2和LONG2、LAT3和LONG3以及LAT4和LONG4。这些值的完整性各不相同,通常有些值为NA。我想创建列“LAT”和“LONG”,并用第一对坐标填充这些列,其中两个坐标都不是NA。我检查的顺序是1,2,3,4。例如,我的数据可能如下所示: ORD LAT1 LONG1 LAT2 LONG2 LAT3 LONG3 LAT4 LONG4 1 NA

我有一个数据框,每行最多有4对不同的地理坐标。包含它们的字段是LAT1和LONG1、LAT2和LONG2、LAT3和LONG3以及LAT4和LONG4。这些值的完整性各不相同,通常有些值为NA。我想创建列“LAT”和“LONG”,并用第一对坐标填充这些列,其中两个坐标都不是NA。我检查的顺序是1,2,3,4。例如,我的数据可能如下所示:

ORD LAT1 LONG1     LAT2     LONG2     LAT3     LONG3     LAT4     LONG4
1   NA   NA       NA        NA        44.65783 -65.86633 44.68800 -65.80183
2   NA   NA       NA        NA        44.67033 -65.81833 44.67333 -65.84767
3   NA   NA       44.19133  -63.32017 44.25583 -63.27117 NA        NA
4   NA   NA       44.25717  NA        44.30950 -63.18617 NA        NA
5   NA   NA       44.30667  -63.17550 44.35483 -63.08717 NA        NA
6   NA   NA       44.35433  -63.07267 44.30633 -63.12117 NA        NA
最后我想说的是:

ORD LAT1 LONG1     LAT2     LONG2     LAT3     LONG3     LAT4     LONG4      LAT       LONG
1   NA   NA       NA        NA        44.65783 -65.86633 44.68800 -65.80183  44.65783  -65.86633
2   NA   NA       NA        NA        44.67033 -65.81833 44.67333 -65.84767  44.67033  -65.81833
3   NA   NA       44.19133  -63.32017 44.25583 -63.27117 NA        NA        44.19133  -63.32017
4   NA   NA       44.25717  NA        44.30950 -63.18617 NA        NA        44.30950  -63.18617
5   NA   NA       44.30667  -63.17550 44.35483 -63.08717 NA        NA        44.30667  -63.17550
6   NA   NA       44.35433  -63.07267 44.30633 -63.12117 NA        NA        44.35433  -63.07267
实际上,我已经通过以下2个
ifelse
块实现了这一点,它们正是我想要的:

set_df$LAT <- ifelse(is.na(set_df$LAT1) | is.na(set_df$LONG1),
                      ifelse(is.na(set_df$LAT2) | is.na(set_df$LONG2),
                          ifelse(is.na(set_df$LAT3) | is.na(set_df$LONG3), set_df$LAT4,set_df$LAT3),
                      set_df$LAT2),
                  set_df$LAT1)
set_df$LONG <- ifelse(is.na(set_df$LAT1) | is.na(set_df$LONG1),
                         ifelse(is.na(set_df$LAT2) | is.na(set_df$LONG2),
                                ifelse(is.na(set_df$LAT3) | is.na(set_df$LONG3), set_df$LONG4,set_df$LONG3),
                         set_df$LONG2),
                   set_df$LONG1)

set_df$LAT这里有一个使用apply的替代解决方案

tmp=apply(dat,1,function(x){
  if (!is.na(x[2]) & !is.na(x[3])) {return(c(x[2],x[3]))}
  else if (!is.na(x[4]) & !is.na(x[5])) {return(c(x[4],x[5]))}
  else if (!is.na(x[6]) & !is.na(x[7])) {return(c(x[6],x[7]))}
  else {return(c(x[8],x[9]))}
})

cbind(dat,t(tmp))

  ORD LAT1 LONG1     LAT2     LONG2     LAT3     LONG3     LAT4     LONG4        1         2
1   1   NA    NA       NA        NA 44.65783 -65.86633 44.68800 -65.80183 44.65783 -65.86633
2   2   NA    NA       NA        NA 44.67033 -65.81833 44.67333 -65.84767 44.67033 -65.81833
3   3   NA    NA 44.19133 -63.32017 44.25583 -63.27117       NA        NA 44.19133 -63.32017
4   4   NA    NA 44.25717        NA 44.30950 -63.18617       NA        NA 44.30950 -63.18617
5   5   NA    NA 44.30667 -63.17550 44.35483 -63.08717       NA        NA 44.30667 -63.17550
6   6   NA    NA 44.35433 -63.07267 44.30633 -63.12117       NA        NA 44.35433 -63.07267

使用循环的解决方案可以接受吗?对于分配多个列,请尝试@user2974951之类的技术-我对此持开放态度,但鉴于我正在努力提高代码的效率,我不确定这是否会更好?@anotherfred-谢谢!在你链接的页面上,我也喜欢奥斯卡·德莱昂的回答。
tmp=apply(dat,1,function(x){
  if (!is.na(x[2]) & !is.na(x[3])) {return(c(x[2],x[3]))}
  else if (!is.na(x[4]) & !is.na(x[5])) {return(c(x[4],x[5]))}
  else if (!is.na(x[6]) & !is.na(x[7])) {return(c(x[6],x[7]))}
  else {return(c(x[8],x[9]))}
})

cbind(dat,t(tmp))

  ORD LAT1 LONG1     LAT2     LONG2     LAT3     LONG3     LAT4     LONG4        1         2
1   1   NA    NA       NA        NA 44.65783 -65.86633 44.68800 -65.80183 44.65783 -65.86633
2   2   NA    NA       NA        NA 44.67033 -65.81833 44.67333 -65.84767 44.67033 -65.81833
3   3   NA    NA 44.19133 -63.32017 44.25583 -63.27117       NA        NA 44.19133 -63.32017
4   4   NA    NA 44.25717        NA 44.30950 -63.18617       NA        NA 44.30950 -63.18617
5   5   NA    NA 44.30667 -63.17550 44.35483 -63.08717       NA        NA 44.30667 -63.17550
6   6   NA    NA 44.35433 -63.07267 44.30633 -63.12117       NA        NA 44.35433 -63.07267