читать строку за строкой CSV-файл в R и создать функцию? - PullRequest
0 голосов
/ 31 января 2020

Я сохранил интерполированные данные в CSV-файл с 181 строк, где каждая строка имеет свой первый элемент, представленный меткой, а остальные являются данными временного ряда, например, в этом формате:

1-й строка: 0, 980, 888, 720 987 543

2-й ряд: 0, 880, 999, 820 990 888, 980, 898, 780 987

3-й ряд: 1, 945, 856, 767 745 883

4-й ряд: 2, 780, 899, 920 890 988, 780, 998, 870, 787

5-й ряд: 2, 800, 900, 822 999 880, 988, 899

и т. Д. Для остальные 181 ряд, где метки 0,1,2,3,4,5,6. Кроме того, обратите внимание, у меня есть разные длины для каждого ряда. Я хочу создать объекты (применяя, скажем, mean () является одной из функций), используя только временные ряды, т. Е. «980, 888, 720,987,543» и исключая «метку y», т. Е. 0, и я хочу сделать это для каждой строки и создать фрейм данных, который имеет 33 функции плюс метку, например:

dim(labl_feat_df)[1] # 181 rows
dim(labl_feat_df)[2] # 34 columns (33 features and the label)

, поэтому labl_feat_df будет выглядеть так:

     label  mean(TS)  SD(TS) ........ feat33
1     0
2     0
.
.
.
181   6

где среднее (TS ) и sd (TS) - первая и вторая функция.

Итак, мои вопросы: как я могу прочитать файл с разной длиной? и если это должно быть построчно, насколько возможно и эффективно создать эти 33 функции и добавить их во фрейм данных?

Ответы [ 2 ]

2 голосов
/ 31 января 2020

1) dplyr / tidyr Используя Lines в примечании в конце, прочитайте его, добавьте номер строки id и измените форму с широкого на длинный. Отбросьте строки NA и суммируйте.

library(dplyr)
library(tidyr)

DF <- read.table(text =Lines, sep = ",", strip.white = TRUE, fill = NA)
DF %>%
  mutate(id = 1:n()) %>%
  pivot_longer(-c(V1, id)) %>%
  drop_na %>%
  group_by(V1, id) %>%
  summarize(mean = mean(value), sd = sd(value)) %>%
  ungroup

, давая:

# A tibble: 5 x 4
     V1    id  mean    sd
  <int> <int> <dbl> <dbl>
1     0     1  824. 190. 
2     0     2  914.  80.3
3     1     3  839.  82.9
4     2     4  879.  84.0
5     2     5  898.  75.3

2) База R Используя DF из (1), преобразуйте в длинную форму, используя reshape, удалите NA, используя na.omit и aggregate:

DF2 <- na.omit(reshape(DF, dir = "long", varying = list(2:ncol(DF))))
aggregate(V2 ~ V1 + id, DF2, function(x) c(mean = mean(x), sd = sd(x)))

давая:

  V1 id   V2.mean     V2.sd
1  0  1 823.60000 190.24800
2  0  2 913.55556  80.28404
3  1  3 839.20000  82.88667
4  2  4 879.11111  83.95750
5  2  5 898.28571  75.28770

Примечание

Lines <- "
0, 980, 888, 720,987,543
0, 880, 999, 820,990,888, 980, 898, 780,987
1, 945, 856, 767,745,883
2, 780, 899, 920,890,988, 780, 998, 870,787
2, 800, 900, 822,999,880, 988, 899"
0 голосов
/ 31 января 2020

Вот простое базовое решение R:

#read file line by line
textfile<-read.table("soquestion.txt", sep = ",", strip.white = TRUE)

#find statistics
mean_TS<-rowMeans(textfile[, 2:ncol(textfile)], na.rm=TRUE)
SD_TS <- apply(textfile[, 2:ncol(textfile)], 1, function(x) {sd(x, na.rm=TRUE)})

answer<-cbind(label=textfile[,1], mean_TS, SD_TS, textfile[,-1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...