R - Заполнение матрицы данными из определенных блоков данных из другой матрицы - PullRequest
0 голосов
/ 24 августа 2018

У меня есть данные в матрице, но в них все еще много ненужной информации (из-за процесса извлечения данных из файлов mhtml).Я хочу «отфильтровать» эти вещи и «свернуть» матрицу (чтобы между данными не было пустой ячейки), чтобы после того, как я сохранил их в электронной таблице, мне не нужно было проводить дополнительную очистку (быть очень удобным, когда вам нужно сделать это для 400+ файлов).

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

Однако, поскольку мне просто нужны определенные блоки матрицы, и я знаю, где находятся эти блоки (я могу определить это с помощью which, чтобы получить определенную ячейку за один ряд до блока (-ов).я подумал, можно ли скопировать конкретные блоки данных, когда я знаю, где они начинаются и где они заканчиваются (фиксированный размер блоков).

Следовательно, кто-нибудь знает способ скопировать несколькоконкретные области матрицы в одну другую матрицу, когда вы знаете ячейки, где начинается блок данных, который имеет фиксированный размер (как в столбцах и строках)?

У меня есть ощущение, что я наблюдаючто-то, потому что это звучит довольно просто.

Правка говорит: тупой, я забыл пример данных (надеюсь, это сработает):

dput(var_table[1:20,1:6])
structure(c("coration:none", "", "Zeit", "kV", "-------------------------------------------------------", 
"1", "2", "3", "4", "5", "6", "7", "8", "", "Phase", "Datum/Zeit", 
"Stufe", "tan-delta-Mittelwert", "Standardabweichung", "Anzahl", 
"color:000000\">Details:", NA, "Spannung", "mA", NA, "12:54:09", 
"12:54:19", "12:54:30", "12:54:39", "12:54:49", "12:55:00", "12:55:10", 
"12:55:20", NA, ".......................", "..................", 
".......................", "........", "..........", "der", NA, 
NA, "Strom", "E-3", NA, "5.8", "5.8", "5.8", "5.8", "5.8", "5.8", 
"5.8", "5.8", NA, ":", ":", ":", ":", ":", "Messungen", NA, NA, 
"tan", NA, NA, "3.07", "3.07", "3.07", "3.07", "3.07", "3.07", 
"3.07", "3.07", NA, "L1", "29-09-2015", "1", "0.343", "0.001", 
"........", NA, NA, "delta", NA, NA, "0.34", "0.34", "0.34", 
"0.34", "0.34", "0.34", "0.34", "0.34", NA, NA, "12:55:20", NA, 
"E-3", "E-3", ":", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, "8"), .Dim = c(20L, 6L))

Просто нужен блок данных из [6:13,1: 5].

Второй фрагмент данных, тот же файл:

structure(c("Phase", "Datum/Zeit", "Stufe", "tan-delta-Mittelwert", 
"Standardabweichung", "Anzahl", "Last", "Prfcfobjekt", "Generator", 
"", "", "Zeit", "kV", "-------------------------------------------------------", 
"1", "2", "3", "4", "5", "6", "7", "8", "", "Phase", "Datum/Zeit", 
"Stufe", "tan-delta-Mittelwert", "Standardabweichung", "Anzahl", 
"Last", "Prfcfobjekt", "Generator", ".......................", 
"..................", ".......................", "........", 
"..........", "der", "........................", "VSE-Strom", 
"VSE-Strom", NA, NA, "Spannung", "mA", NA, "12:56:40", "12:56:50", 
"12:57:00", "12:57:10", "12:57:21", "12:57:31", "12:57:41", "12:57:51", 
NA, ".......................", "..................", ".......................", 
"........", "..........", "der", "........................", 
"VSE-Strom", "VSE-Strom", ":", ":", ":", ":", ":", "Messungen", 
":", "........", ".........", NA, NA, "Strom", "E-3", NA, "11.7", 
"11.7", "11.7", "11.7", "11.7", "11.7", "11.7", "11.7", NA, ":", 
":", ":", ":", ":", "Messungen", ":", "........", ".........", 
"L1", "29-09-2015", "1", "0.343", "0.001", "........", "847.6", 
":", ":", NA, NA, "tan", NA, NA, "6.18", "6.18", "6.18", "6.18", 
"6.18", "6.18", "6.18", "6.19", NA, "L1", "29-09-2015", "2", 
"0.355", "0.001", "........", "843.2", ":", ":", NA, "12:55:20", 
NA, "E-3", "E-3", ":", "nF", "32", "2", NA, NA, "delta", NA, 
NA, "0.35", "0.35", "0.35", "0.36", "0.36", "0.36", "0.36", "0.36", 
NA, NA, "12:57:52", NA, "E-3", "E-3", ":", "nF", "66", "6", NA, 
NA, NA, NA, NA, "8", NA, "b5A", "b5A", NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "8", NA, 
"b5A", "b5A"), .Dim = c(32L, 6L))

Здесь мне понадобится только «Фаза» (иначе [15: 4] и [38: 4])У кого-нибудь есть идея?

1 Ответ

0 голосов
/ 24 августа 2018

Согласно вашему примеру данных, что-то подобное будет работать.

код:

keepRows <- apply(df1,1,function(x){all(grepl("^(\\d|[:.])+$",x)|is.na(x))})
df2 <- df1[keepRows,]

keepCols <- apply(df2,2,function(x){!all(is.na(x))})
df2[,keepCols]

результат:

#     [,1] [,2]       [,3]  [,4]   [,5]  
#[1,] "1"  "12:54:09" "5.8" "3.07" "0.34"
#[2,] "2"  "12:54:19" "5.8" "3.07" "0.34"
#[3,] "3"  "12:54:30" "5.8" "3.07" "0.34"
#[4,] "4"  "12:54:39" "5.8" "3.07" "0.34"
#[5,] "5"  "12:54:49" "5.8" "3.07" "0.34"
#[6,] "6"  "12:55:00" "5.8" "3.07" "0.34"
#[7,] "7"  "12:55:10" "5.8" "3.07" "0.34"
#[8,] "8"  "12:55:20" "5.8" "3.07" "0.34"

Обратите внимание:

  1. Вы должны установить типы
    • На данный момент все ячейки являются символьными строками (текст). С текстом вы не можете сделать математику. Ваш второй столбец - это специальный TIME-формат. Вам нужно преобразовать столбцы в осмысленный тип. Проведите исследование.
  2. Вы действительно хотите использовать матрицу здесь? Вы можете иметь только ОДИН тип внутри КАЖДОЙ матрицы
    • Как я уже упоминал в 1). 2-й столб - формат времени. Другие integer или numeric. Это 2/3 различных data.types. В матрице вы можете иметь только 1. Поэтому в качестве первого шага я бы преобразовал as.data.frame().
  3. В приведенном выше коде я ищу строки, которые имеют только [NA, NUMBERS, : , . ]. Это может быть недостаточно общим для ваших реальных данных.
  4. Введите каждую функцию, которую вы видите, в консоль r следующим образом. ?all, ?apply, ?grepl, ... и читать!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...