Таблица данных R: Как найти неизвестное количество пустых ячеек непосредственно под определенной ячейкой и заполнить их пронумерованными строками - PullRequest
3 голосов
/ 19 марта 2019

Я знаю, как найти пустое cells в data.table в целом, но это немного сложнее, и я не совсем понял, как с этим справиться.

Допустим, у меня есть data.table, в котором в df[2,1] содержится строка ключевого слова, на которую нужно нацелиться: «Смарт вызван!»в этом случае.

Количество умных триггеров, используемых пользователем инструмента, может варьироваться, но они приводят к 1 пустой ячейке ниже df[2,1] для каждого триггера и их имени во 2-м column

Я ищу способ выяснить, сколько пустых cells находится прямо под "Смарт-триггером!"и заполните их последовательно «Умный триггер 1», Умный триггер 2 »... пока мы не нажмем первый следующий cell в column 1, который содержит что-то (« Инструмент »). Есть потенциальные другие пустые ячейки ниже втаблицу, которую я не хочу изменять.

В этом случае мои информационные файлы читаются в data.table, похожем на это:

df <- data.frame(name = c("Trigger", "Smart Triggered!", "", "", "Instrument", "Beam", "Core speed", "Channel1", "Channel2", "Channel3", "Channel4", ""),
values = c("SWS", "", "FLRED", "FLORANGE", "Demo", "5um", "2.2", "FWS", "SWS", "FLRED", "FLORANGE", "x"))

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

enter image description here

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

посмотрите, работает ли это для вас:

library(tidyverse)

df <- data.frame(name = c("Trigger", "Smart Triggered!", "", "", "Instrument", "Beam", "Core speed", "Channel1", "Channel2", "Channel3", "Channel4", ""),
                 values = c("SWS", "", "FLRED", "FLORANGE", "Demo", "5um", "2.2", "FWS", "SWS", "FLRED", "FLORANGE", "x"))

df %>%
  mutate(new_name = ifelse(as.character(name) == "", NA, as.character(name))) %>%
  tidyr::fill(new_name) %>%
  split(.$new_name) %>%
  map_df(., ~.x %>% mutate(row_no = row_number(),
                           row_no = lag(row_no),
                           new_name1 = ifelse(is.na(row_no), 
                                              as.character(new_name), 
                                              paste0(as.character(new_name), "_", row_no)))) %>%
  select(name, new_name, new_name1, values) %>%
  full_join(df, .) %>%
  mutate(name = as.character(name)) %>%
  mutate(name = ifelse(new_name == "Smart Triggered!", new_name1, name)) %>%
  select(name, values)
1 голос
/ 20 марта 2019

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

library(data.table)
df <- data.frame(name = c("Trigger", "Smart Triggered!", "", "", "Instrument", "Beam", "Core speed", "Channel1", "Channel2", "Channel3", "Channel4", ""),
                 values = c("SWS", "", "FLRED", "FLORANGE", "Demo", "5um", "2.2", "FWS", "SWS", "FLRED", "FLORANGE", "x"))

df <- as.data.table(df)

df$name <- as.character(df$name)
counting <<- 1
df$name[2:nrow(df)] <- unlist(lapply(2:nrow(df), function(x){
  if((df[x,]$name=="") && (df[x-counting,]$name=="Smart Triggered!")){
    counting <<- counting + 1
    return(paste0("Smart trigger ", counting))
  }
  else{
    counting <<- 1
    return(df[x,]$name)
  }
}
))
df
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...