R datatable с tidyverse: найти, переместить и переименовать неизвестный номер строки на основе условия ниже ячейки с определенной строкой в ​​ней - PullRequest
1 голос
/ 20 марта 2019

относится к вопросу здесь , но отличается от структуры вопроса

В некоторых версиях информационных файлов, выходящих из моего лабораторного инструмента, интеллектуальные триггеры находятся в левом столбцес пустой ячейкой справа от него.(в другом сценарии они были в правом столбце, а левая сторона была пуста.
Я хочу найти строки, которые на самом деле являются интеллектуальным триггером, то есть ниже ключевого слова, содержащего ячейку, строку: «Smart Triggerd!», как этитриггеры распознаются по пустой ячейке (df[x,y]) рядом с ними. Следующий другой параметр в таблицах содержит записи в обоих столбцах этой строки (сигнализируя о том, что мы передали умные линии триггера)

КоличествоИнтеллектуальные триггеры, используемые пользователем инструмента, могут различаться, но они приводят к появлению строки с именем в ячейке ниже ячейки, содержащей слова «Smart Triggered», то есть df[2,1] для каждого триггера и пустую ячейку рядом с ними.

Таким образом, по сравнению с другим вопросом, они все еще находятся ниже целевой ячейки, откуда я их начал искать, которая содержит «Smart Triggered!», Но теперь находятся в другом столбце.

Подход tidyverse кажется правильным, но в этом случае мне нужно как-то искать пустые ячейки ниже целевой ячейки, сдвинутые на 1 столбецнаправо, чтобы выяснить, с какими строками мы имеем дело, затем сдвинуть значение левого столбца (имена триггеров) в пустое место справа и, наконец, заполнить ячейку слева нумерованными строками «Умный триггер 1», «Интеллектуальный триггер 2 ", ..... n

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

enter image description here

, желающий получить это в качестве вывода: enter image description here

1 Ответ

1 голос
/ 20 марта 2019

Я включил вариант для изменения названия столбцов, это просто, чтобы дать вам почувствовать различные возможности. Обратите внимание, что в df я сделал все столбцы как characters.

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

df %>%
  mutate(new_name = ifelse(values == "" & name != "Smart Triggered!", NA, 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)))) %>%
  mutate(value1 = ifelse(is.na(row_no), values, name)) %>%
  full_join(df, .) %>%
  select(new_name1, value1) %>%
  stats::setNames(., c("name", "values"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...