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