我有一个数据框,每行最多有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
我实际上已经通过以下两个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)
所以我在这里的原因是,这让我感到效率低下,因为我本质上是在识别我想要两次的一对坐标-第一个块仅捕获了LAT,第二个块仅捕获了LAT抢长。
有没有一种方法可以同时获取两个值并将它们立即弹出到新列中?我非常希望仅使用基本R解决方案。
修改: 这里使用@ user2974951的方法,但是具有命名字段和所需的输出:
tmp=apply(set_df,1,function(x){
if (!is.na(x["LAT1"]) & !is.na(x["LONG1"])) {return(c(x[test1="LAT1"],x["LONG1"]))}
else if (!is.na(x["LAT2"]) & !is.na(x["LONG2"])) {return(c(x["LAT2"],x["LONG2"]))}
else if (!is.na(x["LAT3"]) & !is.na(x["LONG3"])) {return(c(x["LAT3"],x["LONG3"]))}
else {return(c(x["LAT4"],x["LONG4"]))}
})
set_df = cbind(set_df,t(tmp))
colnames(set_df)[colnames(set_df)=="1"] <- "LAT"
colnames(set_df)[colnames(set_df)=="2"] <- "LONG"
答案 0 :(得分:2)
这是使用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