#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>