Автоматическое заполнение столбцов в r

#r #dataframe #for-loop

Вопрос:

У меня есть фрейм данных (показан ниже), где в столбце «sig» есть несколько звездочек.
введите описание изображения здесь

Я хочу заполнить звездочками пустые ячейки в столбце sig везде над самой дальней строкой вниз, где есть звездочка, которая в этом случае будет везде от строки «H» и выше, чтобы получить что-то вроде этого:

введите описание изображения здесь

Я думаю, что какой-то цикл for, в котором он определяет самую дальнюю нижнюю строку, где есть звездочка, а затем заполняет звездочки в пустых ячейках выше, может быть правильным решением, но я не уверен, как это закодировать.

Для целей отладки я создаю фрейм данных в R с

 df<- data.frame("variable"= c("a","b","c","d","e","f","g","h","i","j","k"),
                "value" = c(0.04,0.03,0.04,0.02,0.03,0.02,0.02,0.01,0.04,0.1,0.02), 
                "sig" = c("*","*","*","","*","*","","*","","",""))
 

Любая помощь была бы очень признательна — спасибо!

Ответ №1:

Другой способ:

 df[1:max(which(df$sig == "*")), "sig"] = "*"
 

Дает:

    variable value sig
1         a  0.04   *
2         b  0.03   *
3         c  0.04   *
4         d  0.02   *
5         e  0.03   *
6         f  0.02   *
7         g  0.02   *
8         h  0.01   *
9         i  0.04    
10        j  0.10    
11        k  0.02   
 

Ответ №2:

Мы могли бы использовать replace , основываясь на нахождении индекса последнего элемента, имеющего *

 library(dplyr)
df <- df %>%
    mutate(sig = replace(sig, seq(tail(which(sig == "*"), 1)), "*"))
 

-выход

 df
   variable value sig
1         a  0.04   *
2         b  0.03   *
3         c  0.04   *
4         d  0.02   *
5         e  0.03   *
6         f  0.02   *
7         g  0.02   *
8         h  0.01   *
9         i  0.04    
10        j  0.10    
11        k  0.02    
 

Ответ №3:

Другим решением было бы использование fill , но вам нужно перейти "" на NA

Библиотеки

 library(tidyverse)
 

Данные

 df <-
  data.frame("variable"= c("a","b","c","d","e","f","g","h","i","j","k"),
             "value" = c(0.04,0.03,0.04,0.02,0.03,0.02,0.02,0.01,0.04,0.1,0.02), 
             "sig" = c("*","*","*","","*","*","","*","","",""))
 

Код

 df %>% 
  mutate(sig = if_else(sig == "",NA_character_,sig)) %>% 
  fill(sig,.direction = "up")
 

Выход

    variable value  sig
1         a  0.04    *
2         b  0.03    *
3         c  0.04    *
4         d  0.02    *
5         e  0.03    *
6         f  0.02    *
7         g  0.02    *
8         h  0.01    *
9         i  0.04 <NA>
10        j  0.10 <NA>
11        k  0.02 <NA>