Как скопировать в столбец датафрейма значение предыдущей строки только 1 раз? - PullRequest
2 голосов
/ 30 марта 2020

Все в вопросе. Чтобы проиллюстрировать это, у меня есть следующий пример:

date <- c("01.02.2011","02.02.2011","03.02.2011","04.02.2011","05.02.2011","01.02.2011","02.02.2011","03.02.2011","04.02.2011","05.02.2011")
date <- as.Date(date, format="%d.%m.%Y")
ID <- c("A","A","A","A","A","B","B","B","B","B")
indicator <- c(NA,NA,NA,"2.025",NA,NA,"6.777",NA,NA,NA)

df <- data.frame(date, ID, indicator)

Итак, у меня есть один кадр данных, похожий на этот:

         date ID indicator
1  2011-02-01  A   <NA>
2  2011-02-02  A   <NA>
3  2011-02-03  A   <NA>
4  2011-02-04  A  2.025
5  2011-02-05  A   <NA>
6  2011-02-01  B   <NA>
7  2011-02-02  B  6.777
8  2011-02-03  B   <NA>
9  2011-02-04  B   <NA>
10 2011-02-05  B   <NA>

Я хотел бы скопировать значения (поэтому не NA) в указатель столбца 1 раз в следующей строке, чтобы получить:

         date ID indicator
1  2011-02-01  A   <NA>
2  2011-02-02  A   <NA>
3  2011-02-03  A   <NA>
4  2011-02-04  A  2.025
5  2011-02-05  A  2.025
6  2011-02-01  B   <NA>
7  2011-02-02  B  6.777
8  2011-02-03  B  6.777
9  2011-02-04  B   <NA>
10 2011-02-05  B   <NA>

Я пробовал с:

df[which(df$indicator != NA)+1, "indicator"] <-

, но мне не удается найти то, что я должен поставить после "< - «получить соответствующие значения? На самом деле мой фрейм данных имеет около 20000 строк, поэтому я не могу сделать это вручную.

Если требуется какое-либо редактирование, не стесняйтесь, дайте мне знать. Заранее спасибо за помощь

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Вот подход tidyverse. Если предыдущая строка indicator не является NA, скопируйте ее. В противном случае, без изменений.

Примечание I mutate столбец indicator к символу, как это получается из коэффициента из предоставленного примера кадра данных.

library(tidyverse)

df %>%
  group_by(ID) %>%
  mutate(indicator = as.character(indicator)) %>%
  mutate(indicator = ifelse(!is.na(lag(indicator)), lag(indicator), indicator))

Выход

# A tibble: 10 x 3
# Groups:   ID [2]
   date       ID    indicator
   <date>     <fct> <chr>    
 1 2011-02-01 A     NA       
 2 2011-02-02 A     NA       
 3 2011-02-03 A     NA       
 4 2011-02-04 A     2.025    
 5 2011-02-05 A     2.025    
 6 2011-02-01 B     NA       
 7 2011-02-02 B     6.777    
 8 2011-02-03 B     6.777    
 9 2011-02-04 B     NA       
10 2011-02-05 B     NA    
0 голосов
/ 30 марта 2020

Я нашел следующее решение, но оно не может быть самым оптимальным

df.1 <- df[complete.cases(df),]
df.2 <- as.double(df.1[,3])

df[which(df$indicator !="NA")+1,"indicator"] <- df.2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...