Есть много разных способов добиться этого. Вот базовое решение R:
df$individuals <- as.character(df$individual);
sel <- rowSums(is.na(df[, (ncol(df)-1):ncol(df)])) == 2;
df[sel, (ncol(df)-1):ncol(df)] <- df[sel, 1:2];
# individuals pop loc1 loc2 loc3 loc4 loc5 loc6 loc7 loc8 loc9 loc10 loc15
#1 1_1 1 499 501 500 500 500 500 499 500 500 499 501
#2 499 501 500 501 500 500 499 500 500 500 500 499 501
#3 1_2 1 499 501 500 500 500 500 500 500 500 499 501
#4 499 501 500 500 500 500 499 500 500 500 500 499 501
#5 1_3 1 499 501 500 501 500 500 499 500 500 500 501
#6 499 501 500 500 500 500 499 500 500 500 500 499 501
Объяснение: (ncol(df)-1):ncol(df)
выбирает последние два столбца; rowSums(is.na(...)) == 2
возвращает TRUE
, если записи в последних двух столбцах равны NA
. В строках, где sel == TRUE
мы заменяем NA
записей в последних двух столбцах на записи из первых двух столбцов.
Пример данных
df <- read.table(text =
" individuals pop loc1 loc2 loc3 loc4 loc5 loc6 loc7 loc8 loc9 loc10 loc15
1 1_1 1 499 501 500 500 500 500 499 500 500 499 501
2 499 501 500 501 500 500 499 500 500 500 500 NA NA
3 1_2 1 499 501 500 500 500 500 500 500 500 499 501
4 499 501 500 500 500 500 499 500 500 500 500 NA NA
5 1_3 1 499 501 500 501 500 500 499 500 500 500 501
6 499 501 500 500 500 500 499 500 500 500 500 NA NA", header = T, row.names = 1)