Как создать цикл for для фильтрации внутри определенной строки и сохранить выходные данные в новом документе, используя R? - PullRequest
0 голосов
/ 03 января 2019

У меня есть разные наборы данных, которые имеют несколько тысяч строк и имеют одинаковую структуру с 5 столбцами. Подмножество моих данных выглядит так:

INr         FNr         TM          I1              I2
1           1           B2          1598,45         0,14
2           1           B2          930,40          0,11
3           1           B2          107,86          0,04
4           1           B2          881,09          0,11
7           1           B3          2201,98         0,15
8           1           B3          161,30          0,04
9           1           B3          1208,14         0,17
4           2           B3          831,75          0,12
5           2           B3          1027,41         0,14
7           2           B3          2052,16         0,15
8           2           B3          159,63          0,05
9           2           B4          1111,49         0,16
10          2           B4          1312,15         0,12
1           3           B4          863,79          0,10
2           3           B4          104,06          0,04
3           3           B4          816,02          0,11
4           3           B4          1053,02         0,14
5           3           B5          132,32          0,03
6           3           B5          2059,03         0,14
7           3           B5          153,49          0,04
8           3           B5          1118,69         0,15
9           3           B5          1632,66         0,18
10          3           B5          1302,15         0,12

Теперь мне нужно отфильтровать этот фрейм данных для всех различных значений ТМ, которые всегда представляют собой комбинацию буквы и цифры от 1 до 12 (например, А1, В2, В3, С4, D6, F8, ... ). Однако не все буквы и не все цифры присутствуют всегда, как также показано в таблице выше, где от A1 до A12 и B1 отсутствуют.

Чтобы отфильтровать и сохранить данные, я уже написал короткий скрипт, который прекрасно работает, но таким образом мне приходится каждый раз адаптировать параметр для сортировки и получающийся файл вывода:

library(tidyverse)
df %>%
  filter(TM == "B2") %>%
  write.csv(file = "C:/Users/Desktop/B2.csv", row.names = FALSE)

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

Большое спасибо!

1 Ответ

0 голосов
/ 03 января 2019

Вы должны split ваш data.frame в списке, затем печатается каждый элемент списка:

# here you split by the variable you want:
listed <- split(data, data$TM)
 listed
# here the partial result
$B2
  INr FNr TM      I1   I2
1   1   1 B2 1598,45 0,14
2   2   1 B2  930,40 0,11
3   3   1 B2  107,86 0,04
4   4   1 B2  881,09 0,11

$B3
   INr FNr TM      I1   I2
5    7   1 B3 2201,98 0,15
6    8   1 B3  161,30 0,04
7    9   1 B3 1208,14 0,17
8    4   2 B3  831,75 0,12
9    5   2 B3 1027,41 0,14
10   7   2 B3 2052,16 0,15
11   8   2 B3  159,63 0,05
...

Тогда R является векторизованным языком, поэтому вам не нужно в этом случаецикл, но вы можете использовать одну из apply функций, чтобы применить к каждому списку функцию, в данном случае, write.table:

sapply(names(listed),  # here the object to sapply the function 
       # here the function: you have to create the path with paste0
       # adding the x to have the correct names
       function (x) write.table(listed[[x]], file=paste0("C:\\Users\\Desktop\\",x, ".csv")))

С данными:

data <- read.table(text = "INr         FNr         TM          I1              I2
1           1           B2          1598,45         0,14
                   2           1           B2          930,40          0,11
                   3           1           B2          107,86          0,04
                   4           1           B2          881,09          0,11
                   7           1           B3          2201,98         0,15
                   8           1           B3          161,30          0,04
                   9           1           B3          1208,14         0,17
                   4           2           B3          831,75          0,12
                   5           2           B3          1027,41         0,14
                   7           2           B3          2052,16         0,15
                   8           2           B3          159,63          0,05
                   9           2           B4          1111,49         0,16
                   10          2           B4          1312,15         0,12
                   1           3           B4          863,79          0,10
                   2           3           B4          104,06          0,04
                   3           3           B4          816,02          0,11
                   4           3           B4          1053,02         0,14
                   5           3           B5          132,32          0,03
                   6           3           B5          2059,03         0,14
                   7           3           B5          153,49          0,04
                   8           3           B5          1118,69         0,15
                   9           3           B5          1632,66         0,18
                   10          3           B5          1302,15         0,12", header = T)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...