Заменить последние значения на первые значения в последовательных строках в кадре данных - PullRequest
0 голосов
/ 04 мая 2018

Я хотел бы заменить 2 "NA" в конце одной строки на первые 2 значения той же строки. И сделайте это для каждой последующей строки с помощью «NA», то есть 98 строк в моем фрейме данных «Vracpop1». Я ищу и ищу, но не могу ... Спасибо за вашу помощь!

Vracpop1
    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
...

1 Ответ

0 голосов
/ 04 мая 2018

Есть много разных способов добиться этого. Вот базовое решение 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...